XML Tutorial/XSLT stylesheet/id
Содержание
Compare id
File: Data.xml
<?xml version="1.0" encoding="US-ASCII"?>
<?xml-stylesheet href="Transform.xslt" type="text/xsl"?>
<uscities>
<western>
<uscity state="Nevada">Las Vegas</uscity>
<uscity state="Arizona">Phoenix</uscity>
<uscity state="California">San Francisco</uscity>
<uscity state="Nevada">Silver City</uscity>
<uscity state="Washington">Seattle</uscity>
<uscity state="Montana">Missoula</uscity>
</western>
</uscities>
File: Transform.xslt
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:key name="list" match="uscity" use="@state" />
<xsl:template match="/">
<html>
<head>
<title>Western State Cities</title>
</head>
<body>
<xsl:for-each
select="/uscities/western/uscity[generate-id(.)=generate-id(key("list", @state))]/@state">
<xsl:sort />
<h2>
<xsl:value-of select="." />
</h2>
<ul>
<xsl:for-each select="key("list", .)">
<xsl:sort />
<li>
<xsl:value-of select="." />
</li>
</xsl:for-each>
</ul>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Output:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Western State Cities</title>
</head><body>
<h2>Arizona</h2>
<ul>
<li>Phoenix</li>
</ul>
<h2>California</h2>
<ul>
<li>San Francisco</li>
</ul>
<h2>Montana</h2>
<ul>
<li>Missoula</li>
</ul>
<h2>Nevada</h2>
<ul>
<li>Las Vegas</li>
<li>Silver City</li>
</ul>
<h2>Washington</h2>
<ul>
<li>Seattle</li>
</ul>
</body>
</html>
Here is a test of the id()
File: Data.xml
<?xml version="1.0"?>
<parts-list>
<component component-id="1111111">
<name>Book</name>
<partref refid="1"/>
<partref refid="2"/>
<partref refid="3"/>
<partref refid="4"/>
<description>
<partref refid="3"/>.
</description>
</component>
<component component-id="5">
<name>name 1</name>
<partref refid="6"/>
<partref refid="7"/>
<description>
<partref refid="6"/> and a
<partref refid="7"/>.
</description>
</component>
<part part-id="6" supplier="4839">
<name>Pitter</name>
<description>
desc6
</description>
</part>
<part part-id="7" supplier="2983">
<name>Patter</name>
<description>
desc7
</description>
</part>
<part part-id="2" supplier="5910">
<name>Spanner</name>
<description>
You can"t fix anything without one.
</description>
</part>
<supplier country="Great Britain" vendor-id="4839">
<name>A Inc.</name>
</supplier>
<supplier country="Germany" vendor-id="2983">
<name>D</name>
</supplier>
<supplier country="Great Britain" vendor-id="5910">
<name>U Ltd.</name>
</supplier>
</parts-list>
File: Transform.xslt
<?xml version="1.0"?>
<!-- id2.xsl -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:text>
Here is a test of the id() </xsl:text>
<xsl:text>function in reverse:
</xsl:text>
<xsl:for-each select="/parts-list/part">
<xsl:text>
 </xsl:text>
<xsl:value-of select="name"/>
<xsl:text> (part #</xsl:text>
<xsl:value-of select="@part-id"/>
<xsl:text>) is used in these products:
 </xsl:text>
<xsl:for-each
select="/parts-list/component
[partref/@refid=current()/@part-id]">
<xsl:value-of select="name"/>
<xsl:if test="position() != last()">
<xsl:text>
 </xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Output:
Here is a test of the id()
function in reverse:
(part #
) is used in these products:
id() takes a string as its argument and returns a node-set containing any node that has an attribute of type ID equal to the function"s argument
File: Data.xml
<?xml version="1.0"?>
<parts-list>
<component component-id="1111111">
<name>Book</name>
<partref refid="1"/>
<partref refid="2"/>
<partref refid="3"/>
<partref refid="4"/>
<description>
<partref refid="3"/>.
</description>
</component>
<component component-id="5">
<name>name 1</name>
<partref refid="6"/>
<partref refid="7"/>
<description>
<partref refid="6"/> and a
<partref refid="7"/>.
</description>
</component>
<part part-id="6" supplier="4839">
<name>Pitter</name>
<description>
desc6
</description>
</part>
<part part-id="7" supplier="2983">
<name>Patter</name>
<description>
desc7
</description>
</part>
<part part-id="2" supplier="5910">
<name>Spanner</name>
<description>
You can"t fix anything without one.
</description>
</part>
<supplier country="Great Britain" vendor-id="4839">
<name>A Inc.</name>
</supplier>
<supplier country="Germany" vendor-id="2983">
<name>D</name>
</supplier>
<supplier country="Great Britain" vendor-id="5910">
<name>U Ltd.</name>
</supplier>
</parts-list>
File: Transform.xslt
<?xml version="1.0"?>
<!-- id1.xsl -->
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:text>
Here is a test of the id() </xsl:text>
<xsl:text>function:
</xsl:text>
<xsl:for-each select="/parts-list/component">
<xsl:text>
 </xsl:text>
<xsl:value-of select="name"/>
<xsl:text> (component #</xsl:text>
<xsl:value-of select="@component-id"/>
<xsl:text>) uses these parts:
 </xsl:text>
<xsl:for-each select="id(partref/@refid)">
<xsl:value-of select="name"/>
<xsl:text>
 </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Output:
Here is a test of the id() function:
Book (component #1111111) uses these parts:
name 1 (component #5) uses these parts:
select by id()
File: Data.xml
<?xml version="1.0" encoding="UTF-8"?>
<provinces>
<province id="AB">
<name>Alberta</name>
<abbreviation>AB</abbreviation>
</province>
<province id="BC">
<name>British Columbia</name>
<abbreviation>BC</abbreviation>
</province>
<province id="MB">
<name>Manitoba</name>
<abbreviation>MB</abbreviation>
</province>
<province id="NB">
<name>New Brunswick</name>
<abbreviation>NB</abbreviation>
</province>
</provinces>
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="text" />
<xsl:template match="provinces">
<xsl:apply-templates select="id("NU")" />
</xsl:template>
<xsl:template match="id("NU")">
<xsl:value-of select="name" />
</xsl:template>
</xsl:stylesheet>
The id function selects elements by their unique ID.
File: Data.xml
<?xml version="1.0" encoding="utf-8"?>
<data>
<chapter id="intro">Introduction</chapter>
<chapter id="body">
<title id="t1">BODY</title>
<text value="text1">text text text</text>
</chapter>
<chapter id="end">THE END</chapter>
</data>
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="/">
<paragraph>
<xsl:value-of select="id("intro")"/>
</P>
<paragraph>
<xsl:value-of select="id("body")/text"/>
</P>
<paragraph>
<xsl:value-of select="id("text1")"/>
</P>
</xsl:template>
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?><P/><P/><P/>