首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在XSLT中使用KEY,KEYREF显示数据

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

Stack Overflow用户
提问于 2019-04-18 13:55:22
回答 1查看 219关注 0票数 0

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

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

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

骑士=图书馆,骑士=书,kategorie =类别,nazev =名字

XML:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
     <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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-18 14:11:12

定义如下所示的键:

代码语言:javascript
复制
<xsl:key name="categories" match="kategorie_knihy" use="@id_kategorie" />

(这里的名字可以是任何东西!)

然后,为了在你的xsl:for-each中使用它,做这个..。

代码语言:javascript
复制
<xsl:for-each select="key('categories', kategorie)">   
  <td>
    <xsl:value-of select="nazev" />
  </td>
</xsl:for-each>  

尽管这个xsl:for-each需要嵌套在上一个kniha元素上。

试试这个XSLT

代码语言:javascript
复制
<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。你可以这么做..。

代码语言:javascript
复制
<td>
  <xsl:value-of select="pocet_stran" />
</td>
<td>
  <xsl:value-of select="key('categories', kategorie)/nazev" />
</td>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55747565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档