我想在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&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&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&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&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&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&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&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&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>