如何在 XSLT 中使用 KEY、KEYREF 显示数据
How to show data by using KEY, KEYREF in XSLT
我有"library"。有书籍和书籍的类别。
我只是想知道如何显示通过 ID 与图书关联的图书类别。
结果将是 table 所有书籍及其类别。
它是捷克语,但我想你会理解的。
knihovna = 图书馆,kniha = 书,kategorie = 类别,nazev = 名字
XML:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='knihovna.xsl'?>
<knihovna
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="knihovna.xsd"
>
<knihy>
<kniha id_kniha="k-1">
<nazev>Válka s mloky</nazev>
<kategorie>kat-1</kategorie>
</kniha>
<kniha id_kniha="k-2">
<nazev>Povídky z druhé kapsy</nazev>
<kategorie>kat-2</kategorie>
</kniha>
<kniha id_kniha="k-3">
<nazev>Obsluhoval jsem anglického krále</nazev>
<kategorie>kat-1</kategorie>
</kniha>
<kniha id_kniha="k-4">
<nazev>Báječná léta pod psa</nazev>
<kategorie>kat-1</kategorie>
</kniha>
<kniha id_kniha="k-5">
<nazev>Svatý Xaverius</nazev>
<kategorie>kat-3</kategorie>
</kniha>
</knihy>
<kategorie>
<kategorie_knihy id_kategorie="kat-1">
<nazev>Romaneto</nazev>
<kategorie_knihy id_kategorie="kat-2">
<nazev>Román</nazev>
</kategorie_knihy>
<kategorie_knihy id_kategorie="kat-3">
<nazev>Povídka</nazev>
</kategorie_knihy>
<kategorie_knihy id_kategorie="kat-4">
<nazev>Alegorie</nazev>
</kategorie_knihy>
</kategorie>
</knihovna>
XSD:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name='knihovna'>
<xs:complexType>
<xs:sequence>
<xs:element name='knihy'>
<xs:complexType>
<xs:sequence>
<xs:element name='kniha' type='knihaVzor' minOccurs='0' maxOccurs='unbounded' />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name='kategorie'>
<xs:complexType>
<xs:sequence>
<xs:element name='kategorie_knihy' type='kategorieVzor' minOccurs='0' maxOccurs='unbounded' />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="knihaVzor">
<xs:sequence>
<xs:element name="nazev" type="xs:string"/>
<xs:element name="kategorie" type="xs:string"/>
</xs:sequence>
<xs:attribute name="id_kniha" type="xs:string"/>
</xs:complexType>
<xs:complexType name="kategorieVzor">
<xs:sequence>
<xs:element name="nazev" type="xs:string"/>
</xs:sequence>
<xs:attribute name="id_kategorie" type="xs:string"/>
</xs:complexType>
</xs:restriction>
</xs:simpleType>
</xs:schema>
XSL:
<table width="100%" border="1">
<th>Nazev</th>
<th>Rok vydani</th>
<th>Pocet stran</th>
<xsl:for-each select="knihovna/knihy/kniha">
<tr>
<td>
<xsl:value-of select="nazev" />
</td>
<td>
<xsl:value-of select="rok_vydani" />
</td>
<td>
<xsl:value-of select="pocet_stran" />
</td>
</tr>
</xsl:for-each>
<xsl:for-each select="knihovna/kategorie/kategorie_knihy[@id_kategorie='WHAT HERE?']">
<td>
<xsl:value-of select="nazev" />
</td>
</xsl:for-each>
</table>
像这样定义一个键:
<xsl:key name="categories" match="kategorie_knihy" use="@id_kategorie" />
(这里的名字实际上可以是任何东西!)
然后,要在您的 xsl:for-each
中使用它,请执行此操作...
<xsl:for-each select="key('categories', kategorie)">
<td>
<xsl:value-of select="nazev" />
</td>
</xsl:for-each>
尽管这个 xsl:for-each
需要嵌套在前一个 kniha
元素上。
试试这个 XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes"/>
<xsl:key name="categories" match="kategorie_knihy" use="@id_kategorie" />
<xsl:template match="/">
<table width="100%" border="1">
<th>Nazev</th>
<th>Rok vydani</th>
<th>Pocet stran</th>
<xsl:for-each select="knihovna/knihy/kniha">
<tr>
<td>
<xsl:value-of select="nazev" />
</td>
<td>
<xsl:value-of select="rok_vydani" />
</td>
<td>
<xsl:value-of select="pocet_stran" />
</td>
<xsl:for-each select="key('categories', kategorie)">
<td>
<xsl:value-of select="nazev" />
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
请注意,如果一本书只能有一个类别,则根本不需要此处的 xsl:for-each
。你可以这样做...
<td>
<xsl:value-of select="pocet_stran" />
</td>
<td>
<xsl:value-of select="key('categories', kategorie)/nazev" />
</td>
我有"library"。有书籍和书籍的类别。 我只是想知道如何显示通过 ID 与图书关联的图书类别。
结果将是 table 所有书籍及其类别。
它是捷克语,但我想你会理解的。
knihovna = 图书馆,kniha = 书,kategorie = 类别,nazev = 名字
XML:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='knihovna.xsl'?>
<knihovna
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="knihovna.xsd"
>
<knihy>
<kniha id_kniha="k-1">
<nazev>Válka s mloky</nazev>
<kategorie>kat-1</kategorie>
</kniha>
<kniha id_kniha="k-2">
<nazev>Povídky z druhé kapsy</nazev>
<kategorie>kat-2</kategorie>
</kniha>
<kniha id_kniha="k-3">
<nazev>Obsluhoval jsem anglického krále</nazev>
<kategorie>kat-1</kategorie>
</kniha>
<kniha id_kniha="k-4">
<nazev>Báječná léta pod psa</nazev>
<kategorie>kat-1</kategorie>
</kniha>
<kniha id_kniha="k-5">
<nazev>Svatý Xaverius</nazev>
<kategorie>kat-3</kategorie>
</kniha>
</knihy>
<kategorie>
<kategorie_knihy id_kategorie="kat-1">
<nazev>Romaneto</nazev>
<kategorie_knihy id_kategorie="kat-2">
<nazev>Román</nazev>
</kategorie_knihy>
<kategorie_knihy id_kategorie="kat-3">
<nazev>Povídka</nazev>
</kategorie_knihy>
<kategorie_knihy id_kategorie="kat-4">
<nazev>Alegorie</nazev>
</kategorie_knihy>
</kategorie>
</knihovna>
XSD:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name='knihovna'>
<xs:complexType>
<xs:sequence>
<xs:element name='knihy'>
<xs:complexType>
<xs:sequence>
<xs:element name='kniha' type='knihaVzor' minOccurs='0' maxOccurs='unbounded' />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name='kategorie'>
<xs:complexType>
<xs:sequence>
<xs:element name='kategorie_knihy' type='kategorieVzor' minOccurs='0' maxOccurs='unbounded' />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="knihaVzor">
<xs:sequence>
<xs:element name="nazev" type="xs:string"/>
<xs:element name="kategorie" type="xs:string"/>
</xs:sequence>
<xs:attribute name="id_kniha" type="xs:string"/>
</xs:complexType>
<xs:complexType name="kategorieVzor">
<xs:sequence>
<xs:element name="nazev" type="xs:string"/>
</xs:sequence>
<xs:attribute name="id_kategorie" type="xs:string"/>
</xs:complexType>
</xs:restriction>
</xs:simpleType>
</xs:schema>
XSL:
<table width="100%" border="1">
<th>Nazev</th>
<th>Rok vydani</th>
<th>Pocet stran</th>
<xsl:for-each select="knihovna/knihy/kniha">
<tr>
<td>
<xsl:value-of select="nazev" />
</td>
<td>
<xsl:value-of select="rok_vydani" />
</td>
<td>
<xsl:value-of select="pocet_stran" />
</td>
</tr>
</xsl:for-each>
<xsl:for-each select="knihovna/kategorie/kategorie_knihy[@id_kategorie='WHAT HERE?']">
<td>
<xsl:value-of select="nazev" />
</td>
</xsl:for-each>
</table>
像这样定义一个键:
<xsl:key name="categories" match="kategorie_knihy" use="@id_kategorie" />
(这里的名字实际上可以是任何东西!)
然后,要在您的 xsl:for-each
中使用它,请执行此操作...
<xsl:for-each select="key('categories', kategorie)">
<td>
<xsl:value-of select="nazev" />
</td>
</xsl:for-each>
尽管这个 xsl:for-each
需要嵌套在前一个 kniha
元素上。
试试这个 XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes"/>
<xsl:key name="categories" match="kategorie_knihy" use="@id_kategorie" />
<xsl:template match="/">
<table width="100%" border="1">
<th>Nazev</th>
<th>Rok vydani</th>
<th>Pocet stran</th>
<xsl:for-each select="knihovna/knihy/kniha">
<tr>
<td>
<xsl:value-of select="nazev" />
</td>
<td>
<xsl:value-of select="rok_vydani" />
</td>
<td>
<xsl:value-of select="pocet_stran" />
</td>
<xsl:for-each select="key('categories', kategorie)">
<td>
<xsl:value-of select="nazev" />
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
请注意,如果一本书只能有一个类别,则根本不需要此处的 xsl:for-each
。你可以这样做...
<td>
<xsl:value-of select="pocet_stran" />
</td>
<td>
<xsl:value-of select="key('categories', kategorie)/nazev" />
</td>