XML/XSLT stylesheet/generate id
Create id with generate-id()
<source lang="xml">
File: Data.xml <resorts>
<resort> <name>A</name> <details>B</details> <hotel> <name>C</name> <stars>5</stars> <address> . . . </address> </hotel> <hotel> <name>L</name> <stars>2</stars> <address> . . . </address> </hotel> </resort> <resort> <name>D</name> <details>E</details> <hotel> <name>W</name> <stars>5</stars> <address> . . . </address> </hotel> <hotel> <name>P</name> <stars>2</stars> <address> . . . </address> </hotel> </resort>
</resorts>
File: Transform.xslt <html xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xsl:version="1.0"> <body>
Hotels
<xsl:for-each select="//hotel"> <xsl:sort select="number(stars)" order="descending" data-type="number" />
<xsl:value-of select="name" />
Address: <xsl:value-of select="address" />
Stars: <xsl:value-of select="stars" />
Resort: <a href="#{generate-id(parent::resort)}"> <xsl:value-of select="parent::resort/name" /> </a>
</xsl:for-each>
Resorts
<xsl:for-each select="//resort">
<a name="{generate-id()}"> <xsl:value-of select="name" /> </a>
<xsl:value-of select="details" />
</xsl:for-each> </body>
</html> Output: <html>
<body>
Hotels
C
Address: . . .
Stars: 5
Resort: <a href="#d3e3">A</a>
W
Address: . . .
Stars: 5
Resort: <a href="#d3e36">D</a>
L
Address: . . .
Stars: 2
Resort: <a href="#d3e3">A</a>
P
Address: . . .
Stars: 2
Resort: <a href="#d3e36">D</a>
Resorts
<a name="d3e3">A</a>
B
<a name="d3e36">D</a>
E
</body>
</html>
</source>
generate-id() function
<source lang="xml">
File: Data.xml <verse color="red">
<amount>5</amount>
</verse> File: Transform.xslt <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"> <xsl:output method="xml" omit-xml-declaration="yes" indent="no" /> <xsl:template match="verse"> <line status="done" hue="{@color}" number="{amount}" sourceElement="src{generate-id()}" /> </xsl:template>
</xsl:stylesheet> Output: <line status="done" hue="red" number="5" sourceElement="srcd2e1"/>
</source>
Get value out of generate-id() with value-of
<source lang="xml">
File: Data.xml <verse color="red">
<amount>5</amount>
</verse>
File: Transform.xslt <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"> <xsl:output method="xml" omit-xml-declaration="yes" indent="no" /> <xsl:template match="verse"> <xsl:element name="line"> <xsl:attribute name="status">done</xsl:attribute> <xsl:attribute name="hue"> <xsl:value-of select="@color" /> </xsl:attribute> <xsl:attribute name="number"> <xsl:value-of select="amount" /> </xsl:attribute> <xsl:attribute name="sourceElement"> <xsl:text>src</xsl:text> <xsl:value-of select="generate-id()" /> </xsl:attribute> </xsl:element> </xsl:template>
</xsl:stylesheet> Output: <line status="done" hue="red" number="5" sourceElement="srcd2e1"/>
</source>