2016-01-03 65 views
0

我想在XSLT中使用key()函數並顯示每個元素「dystrybutor」的屬性值。我知道這可以以更簡單的方式完成,但是如果可能的話,我想這樣做。我想要連接元素「dystrybutor」和「d」。XSLT - 鍵功能

這裏是我的XML

<?xml version='1.0' encoding='UTF-8' ?> 
<?xml-stylesheet type="text/css" href="css.css"?> 

<document> 

    <płytoteka> 
     <bestseller rok="2015"> 
      <płyta id="p01" gatunek="Pop&amp;Rock"> 
       <tytuł>Atramentowa</tytuł> 
       <wykonawca>Celińska Stanisława</wykonawca> 
       <data_premiery>2015-05-08</data_premiery> 
       <dystrybutor idref="d1" /> 
       <cena waluta="PLN">37.49</cena> 
       <rok_nagrania>2015</rok_nagrania> 
      </płyta> 

      <płyta id="p08" gatunek="Pop&amp;Rock"> 
       <tytuł>Składam się z ciągłych powtórzeń</tytuł> 
       <wykonawca>Rojek Artur</wykonawca> 
       <data_premiery>2014-04-04</data_premiery> 
       <dystrybutor idref="d1" /> 
       <cena waluta="PLN">33.99</cena> 
       <rok_nagrania>2014</rok_nagrania> 
      </płyta> 
     </bestseller> 

     <dystrybutorzy> 
      <d id="d1"> 
       <nazwa>Firma Księgarska Olesiejuk</nazwa> 
       <miasto>Ożarów Mazowiecki</miasto> 
       <ulica nr="91">Poznańska</ulica> 
       <kod_pocztowy>05-850</kod_pocztowy> 
       <telefon kier="22">733-51-50</telefon> 
      </d> 
     </dystrybutorzy> 
    </płytoteka> 
</document> 

和XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       exclude-result-prefixes="xs" 
       xmlns:date="http://exslt.org/dates-and-times" 
       extension-element-prefixes="date" 
       xmlns:math="http://exslt.org/math" 
       xmlns:fn="http://www.w3.org/2005/xpath-functions"> 

    <xsl:output method="xml" version="1.0" encoding="UTF-8" 
     indent="yes" /> 

    <xsl:template match="*"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@* | *[not(node())]" /> 

    <xsl:template match="/document"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="/"> 
     <xsl:element name="document"> 
      <xsl:apply-templates /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="//płytoteka"> 
     <xsl:element name="płytoteka"> 
      <xsl:apply-templates select="bestseller" /> 
      <xsl:apply-templates select="dystrybutorzy" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="//dystrybutorzy"> 
     <xsl:element name="dystrybutorzy"> 
      <xsl:apply-templates select="d" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="//d"> 
     <xsl:element name="d"> 
      <xsl:attribute name="id"> 
       <xsl:value-of select="./@id" /> 
      </xsl:attribute> 
      <xsl:element name="nazwa"> 
       <xsl:value-of select="./nazwa" /> 
      </xsl:element> 
      <xsl:element name="miasto"> 
       <xsl:value-of select="./miasto" /> 
      </xsl:element> 
      <xsl:apply-templates select="ulica" /> 
      <xsl:element name="kod_pocztowy"> 
       <xsl:value-of select="./kod_pocztowy" /> 
      </xsl:element> 
      <xsl:apply-templates select="telefon" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="//telefon"> 
     <xsl:element name="telefon"> 
      <xsl:value-of select="concat('+' , ./@kier,' ',.)"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="//ulica"> 
     <xsl:element name="ulica"> 
      <xsl:value-of select="concat(.,' ', ./@nr)" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="//bestseller"> 
     <xsl:element name="bestseller"> 
      <xsl:attribute name="rok"> 
       <xsl:value-of select="./@rok" /> 
      </xsl:attribute> 
      <xsl:apply-templates select="płyta" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="//płyta"> 
     <xsl:element name="płyta"> 
      <xsl:attribute name="id"> 
       <xsl:value-of select="./@id" /> 
     </xsl:attribute> 
      <xsl:element name="gatunek"> 
       <xsl:value-of select="./@gatunek" /> 
      </xsl:element> 
      <xsl:element name="tytuł"> 
       <xsl:value-of select="./tytuł" /> 
      </xsl:element> 
      <xsl:element name="wykonawca"> 
       <xsl:value-of select="./wykonawca" /> 
      </xsl:element> 
      <xsl:element name="data_premiery"> 
       <xsl:value-of select="./data_premiery" /> 
      </xsl:element> 
      <xsl:element name="dystrybutor"> 
       <xsl:variable name="WybranyDystrybutor" select="key('dystrybutorKEY', @idref)" /> 
       <!--<xsl:attribute name="idref"> 
        <xsl:value-of select="./dystrybutor/@idref" /> 
       </xsl:attribute>--> 
       <xsl:attribute name="idref"> 
        <xsl:value-of select="$WybranyDystrybutor/@idref" /> 
       </xsl:attribute> 
      </xsl:element> 
      <xsl:apply-templates select="cena"/> 
      <xsl:element name="rok_nagrania"> 
       <xsl:value-of select="./rok_nagrania" /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <xsl:key use="@idref" name="dystrybutorKEY" match="//bestseller/płyta/dystrybutor" /> 
    <!--<xsl:key use="@id" name="dystrybutorREF" match="//dystrybutorzy/d" />--> 

</xsl:stylesheet> 

我希望

<?xml version="1.0" encoding="UTF-8"?> 
<document> 

     <płytoteka> 
     <bestseller rok="2015"> 
     <płyta id="p01"> 
      <gatunek>Pop&amp;Rock</gatunek> 
      <tytuł>Atramentowa</tytuł> 
      <wykonawca>Celińska Stanisława</wykonawca> 
      <data_premiery>2015-05-08</data_premiery> 
      <dystrybutor idref="d1"/> 
      <cena>37.49</cena> 
      <rok_nagrania>2015</rok_nagrania> 
     </płyta> 
     <płyta id="p08"> 
      <gatunek>Pop&amp;Rock</gatunek> 
      <tytuł>Składam się z ciągłych powtórzeń</tytuł> 
      <wykonawca>Rojek Artur</wykonawca> 
      <data_premiery>2014-04-04</data_premiery> 
      <dystrybutor idref="d1"/> 
      <cena>33.99</cena> 
      <rok_nagrania>2014</rok_nagrania> 
     </płyta> 
     </bestseller> 
     <dystrybutorzy> 
     <d id="d1"> 
      <nazwa>Firma Księgarska Olesiejuk</nazwa> 
      <miasto>Ożarów Mazowiecki</miasto> 
      <ulica>Poznańska 91</ulica> 
      <kod_pocztowy>05-850</kod_pocztowy> 
      <telefon>+22 733-51-50</telefon> 
     </d> 
     </dystrybutorzy> 
    </płytoteka> 
</document> 

好吧,我明白你的解釋,我的錯誤。我可以引用這個元素

<d id="d1">這個<dystrybutor idref="d1" />

這裏是鏈接transformation 預先感謝您。

+0

一般情況下,你可以使用一鍵解決交叉引用。我在輸入中看不到任何交叉引用,因此沒有理由使用密鑰。如果您的文件有另一個分支機構描述各種分銷商,並且您想從那裏獲取相關分銷商的詳細信息,情況會有所不同。 –

回答

0

以下樣式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="dystrybutorKEY" match="d" use="@id" /> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="płyta/@gatunek"> 
    <gatunek> 
     <xsl:value-of select="."/> 
    </gatunek> 
</xsl:template> 

<xsl:template match="dystrybutor"> 
    <xsl:copy> 
     <xsl:value-of select="key('dystrybutorKEY', @idref)/nazwa"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="dystrybutorzy"/> 

</xsl:stylesheet> 

應用於以下輸入:

XML

<document> 
    <płytoteka> 
     <bestseller rok="2015"> 
      <płyta id="p01" gatunek="Pop&amp;Rock"> 
       <tytuł>Atramentowa</tytuł> 
       <wykonawca>Celińska Stanisława</wykonawca> 
       <data_premiery>2015-05-08</data_premiery> 
       <dystrybutor idref="d1" /> 
       <cena waluta="PLN">37.49</cena> 
       <rok_nagrania>2015</rok_nagrania> 
      </płyta> 

      <płyta id="p08" gatunek="Pop&amp;Rock"> 
       <tytuł>Składam się z ciągłych powtórzeń</tytuł> 
       <wykonawca>Rojek Artur</wykonawca> 
       <data_premiery>2014-04-04</data_premiery> 
       <dystrybutor idref="d1" /> 
       <cena waluta="PLN">33.99</cena> 
       <rok_nagrania>2014</rok_nagrania> 
      </płyta> 
     </bestseller> 

     <dystrybutorzy> 
      <d id="d1"> 
       <nazwa>Firma Księgarska Olesiejuk</nazwa> 
       <miasto>Ożarów Mazowiecki</miasto> 
       <ulica nr="91">Poznańska</ulica> 
       <kod_pocztowy>05-850</kod_pocztowy> 
       <telefon kier="22">733-51-50</telefon> 
      </d> 
     </dystrybutorzy> 
    </płytoteka> 
</document> 

將返回:

結果

<?xml version="1.0" encoding="UTF-8"?> 
<document> 
    <płytoteka> 
    <bestseller rok="2015"> 
     <płyta id="p01"> 
     <gatunek>Pop&amp;Rock</gatunek> 
     <tytuł>Atramentowa</tytuł> 
     <wykonawca>Celińska Stanisława</wykonawca> 
     <data_premiery>2015-05-08</data_premiery> 
     <dystrybutor>Firma Księgarska Olesiejuk</dystrybutor> 
     <cena waluta="PLN">37.49</cena> 
     <rok_nagrania>2015</rok_nagrania> 
     </płyta> 
     <płyta id="p08"> 
     <gatunek>Pop&amp;Rock</gatunek> 
     <tytuł>Składam się z ciągłych powtórzeń</tytuł> 
     <wykonawca>Rojek Artur</wykonawca> 
     <data_premiery>2014-04-04</data_premiery> 
     <dystrybutor>Firma Księgarska Olesiejuk</dystrybutor> 
     <cena waluta="PLN">33.99</cena> 
     <rok_nagrania>2014</rok_nagrania> 
     </płyta> 
    </bestseller> 
    </płytoteka> 
</document>