XML/XSLT stylesheet/ancestor
Содержание
ancestor::node index
<source lang="xml">
File: Data.xml <?xml-stylesheet type="text/xsl" href="Transform.xslt"?> <orgchart date="28 March 2001">
<person> <name>chart 1</name> <title>title1</title> <reports> <person> <name>a</name> <title>b</title> <reports> <person> <name>c</name> <title>d</title> </person> <person> <name>e</name> <title>f</title> </person> </reports> </person> <person> <name>S</name> <title>M</title> </person> <person> <name>S</name> <title>I</title> </person> </reports> </person>
</orgchart>
File: Transform.xslt <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"> <xsl:param name="title">Management Structure</xsl:param> <xsl:output indent="yes" /> <xsl:template match="/"> <html> <head> <title> <xsl:value-of select="$title" /> </title> </head> <body>
<xsl:value-of select="$title" />
The following responsibilies were announced on <xsl:value-of select="/orgchart/@date" /> :
Name | Role | Reporting to |
---|---|---|
<xsl:value-of select="name" /> |
<xsl:value-of select="title" /> |
<xsl:value-of select="ancestor::person[1]/name" /> |
</body> </html> </xsl:template>
</xsl:stylesheet> Output: <html>
<head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Management Structure</title> </head> <body>
Management Structure
The following responsibilies were announced on 28 March 2001 :
Name | Role | Reporting to |
---|---|---|
chart 1 | title1 | |
a | b | chart 1 |
c | d | a |
e | f | a |
S | M | chart 1 |
S | I | chart 1 |
</body>
</html>
</source>
Get value: $node/ancestor::node()
<source lang="xml">
File: Data.xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="Transform.xslt" type="text/xsl"?> <employees xmlns="http://www.domain.ru/namespace/employee">
<title>Employee Data File</title> <employee eid="1" dept="programming"> <contact addInfo="info1"> <name> <firstName>Joe</firstName> <middleName int="B">Brian</middleName> <lastName>Smith</lastName> </name> <address> <street>1 Drive</street> <city>Vancouver</city> <state>BC</state> <zipcode>80210</zipcode> </address> <phone> <tel type="wk">111-1111111</tel> <tel type="hm">222-222222</tel> <fax>303-4667357</fax> </phone> <email>a@a.ru</email> </contact> <hireDate>2008-10-29</hireDate> </employee> <employee eid="2" dept="training"> <contact addInfo="info2"> <name> <firstName>S</firstName> <middleName int="S">S</middleName> <lastName>W</lastName> </name> <address> <street>1 St.</street> <city>Austin</city> <state>Texas</state> <zipcode>22222</zipcode> </address> <phone> <tel type="wk">512-3467899</tel> <tel type="hm">512-4623356</tel> <fax>512-3465655</fax> </phone> <email>s@s.ru</email> </contact> <hireDate>2000-03-11</hireDate> </employee>
</employees>
File: Transform.xslt <?xml version="1.0"?> <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0"> <xsl:output method="text" /> <xsl:template match="/"> <xsl:for-each select="//*"> <xsl:value-of select="concat(name(), " -- ")" /> <xsl:call-template name="depth" /> ; </xsl:for-each> </xsl:template> <xsl:template name="depth"> <xsl:param name="node" as="node()" select="." /> <xsl:value-of select="count($node/ancestor::node())" /> </xsl:template>
</xsl:transform> Output: employees -- 1
; title -- 2 ; employee -- 2 ; contact -- 3 ; name -- 4 ; firstName -- 5 ; middleName -- 5 ; lastName -- 5 ; address -- 4 ; street -- 5 ; city -- 5 ; state -- 5 ; zipcode -- 5 ; phone -- 4 ; tel -- 5 ; tel -- 5 ; fax -- 5 ; email -- 4 ; hireDate -- 3 ; employee -- 2 ; contact -- 3 ; name -- 4 ; firstName -- 5 ; middleName -- 5 ; lastName -- 5 ; address -- 4 ; street -- 5 ; city -- 5 ; state -- 5 ; zipcode -- 5 ; phone -- 4 ; tel -- 5 ; tel -- 5 ; fax -- 5 ; email -- 4 ; hireDate -- 3 ; </source>
if test="ancestor::chapter"
<source lang="xml">
File: Data.xml <book>
<title>title 1</title> <chapter> <title>chapter 1</title> <para>line 1</para> <para>line 2</para> </chapter> <chapter> <title>title 2</title> <para>line 3</para> <para>line 4</para> </chapter>
</book> 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="para"> <xsl:if test="ancestor::appendix">
<xsl:apply-templates />
</xsl:if> <xsl:if test="ancestor::chapter">
<xsl:apply-templates />
</xsl:if> </xsl:template>
</xsl:stylesheet> Output:
title 1 chapter 1
line 1
line 2
title 2
line 3
line 4
</source>