Как показать данные с помощью KEY, KEYREF в XSLT - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть "библиотека". Есть книги и категории книг. Я просто хочу знать, как я могу отобразить категорию книги, которая связана с книгой по идентификатору.

Результатом будет таблица всех книг и их категорий.

Это на чешском языке, но я думаю, что вы поймете это.

Книховна = библиотека, книга = книга, категория = категория, имя = имя

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>

1 Ответ

0 голосов
/ 18 апреля 2019

Определите ключ следующим образом:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...