XML Tutorial/XSLT stylesheet/generate id
Содержание
Assign value from generate-id(.) to attribute
<source lang="xml">
File: Data.xml <?xml version="1.0"?> <greet>
<greeting xml:lang="en">Welcome</greeting> <greeting xml:lang="fr">Bienvenue</greeting> <greeting xml:lang="es">Bienvenido</greeting> <greeting xml:lang="de">Willkommen</greeting>
</greet> File: Transform.xslt <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" /> <xsl:output doctype-system="greeting.dtd" /> <xsl:template match="greet"> <xsl:element name="greeting"> <xsl:apply-templates select="greeting" /> </xsl:element> </xsl:template> <xsl:template match="greeting"> <xsl:element name="welcome"> <xsl:attribute name="xml:lang"><xsl:value-of select="@xml:lang" /> </xsl:attribute> <xsl:attribute name="id"><xsl:value-of select="generate-id(.)" /> </xsl:attribute> <xsl:value-of select="current()" /> </xsl:element> </xsl:template>
</xsl:stylesheet> Output: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE greeting
SYSTEM "greeting.dtd">
<greeting>
<welcome xml:lang="en" id="d2e3">Welcome</welcome> <welcome xml:lang="fr" id="d2e6">Bienvenue</welcome> <welcome xml:lang="es" id="d2e9">Bienvenido</welcome> <welcome xml:lang="de" id="d2e12">Willkommen</welcome>
</greeting></source>
for-each select=/addressbook/address[generate-id(.)=generate-id(key(zipcodes, zip)[1])]
<source lang="xml">
File: Data.xml <?xml version="1.0"?> <addressbook>
<address> <name> <title>Mr.</title> <first-name>Doris</first-name> <last-name>Smith</last-name> </name> <street>1234 Main Street</street> <city>Sheboygan</city> <state>WI</state> <zip>48392</zip> </address>
</addressbook> File: Transform.xslt <?xml version="1.0"?> <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:key name="zipcodes" match="address" use="zip"/> <xsl:template match="/"> <html> <head> <title>Customers grouped by Zip code</title> </head> <body>
<xsl:text>Zip code </xsl:text> |
</xsl:if>
<xsl:value-of select="name/first-name"/>
<xsl:text> </xsl:text>
<xsl:value-of select="name/last-name"/>
|
<xsl:value-of select="street"/> |
</body> </html> </xsl:template>
</xsl:stylesheet> Output: <html>
<head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Customers grouped by Zip code</title> </head> <body>
Zip code 48392 Sheboygan, WI |
Doris Smith | 1234 Main Street |
</body>
</html></source>
generate-id() generates id conforming to XML spec
<source lang="xml">
File: Data.xml <?xml version="1.0" encoding="utf-8"?>
<AAA name="top"> <BBB pos="1" val="bbb">11111</BBB> <BBB>22222</BBB> </AAA> <AAA name="bottom"> <BBB>33333</BBB> <BBB>44444</BBB> </AAA>
File: Transform.xslt <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet
version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/">
<xsl:text>generate-id(//AAA) : </xsl:text> <xsl:value-of select="generate-id(//AAA) "/>
<xsl:text>generate-id(//BBB) : </xsl:text> <xsl:value-of select="generate-id(//BBB) "/>
<xsl:text>generate-id(//AAA[1]) : </xsl:text> <xsl:value-of select="generate-id(//AAA[1]) "/>
<xsl:text>generate-id(//*[1]) : </xsl:text> <xsl:value-of select="generate-id(//*[1]) "/>
<xsl:text>generate-id(//xslTutorial/*[1]) : </xsl:text> <xsl:value-of select="generate-id(//xslTutorial/*[1]) "/>
</xsl:template>
</xsl:stylesheet> Output:
<?xml version="1.0" encoding="UTF-8"?>
uses generate-id() to add id to all elements in source XML.
<source lang="xml">
File: Data.xml <?xml version="1.0" encoding="utf-8"?>
<AAA name="top"> <BBB pos="1" val="bbb">11111</BBB> <BBB>22222</BBB> </AAA> <AAA name="bottom"> <BBB>33333</BBB> <BBB>44444</BBB> </AAA>
File: Transform.xslt <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet
version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="*"> <xsl:copy> <xsl:attribute name="id"><xsl:value-of select="generate-id()"/></xsl:attribute> <xsl:for-each select="@*"> <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute> </xsl:for-each> <xsl:apply-templates/> </xsl:copy> </xsl:template>
</xsl:stylesheet> Output: <?xml version="1.0" encoding="UTF-8"?>
<AAA id="d2e3" name="top"> <BBB id="d2e5" pos="1" val="bbb">11111</BBB> <BBB id="d2e8">22222</BBB> </AAA> <AAA id="d2e12" name="bottom"> <BBB id="d2e14">33333</BBB> <BBB id="d2e17">44444</BBB> </AAA>
</source>