XSLT - 关键功能

时间:2016-01-03 18:45:07

标签: xml xslt

我想在XSLT中使用key()函数并显示每个元素的属性值" dystrybutor"。我知道它可以以更简单的方式完成,但我希望如果可能的话就这样做。我想要连接元素" dystrybutor"和" d"。

这是我的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的链接 提前谢谢。

1 个答案:

答案 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>