如何在XSLT中使用KEY,KEYREF显示数据

问题描述 投票:0回答:1

我有“图书馆”。有书籍和书籍类别。我只是想知道如何显示通过ID与书籍相关联的书籍类别。

结果将是所有书籍及其类别的表格。

它是捷克语,但我想你会理解它。

library = library,book = book,category = category,name = name

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>
xml xslt xsd
1个回答
0
投票

像这样定义一个键:

<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>
© www.soinside.com 2019 - 2024. All rights reserved.