Dar*_*lsh 5 xslt xpath xslt-2.0 xpath-2.0
当我使用“apply-templates”并选择一个变量序列时,模板是作用于序列中元素的上下文,还是作用于文档中元素的上下文?
在下面的例子中,它似乎要么做,要么不做,但我不明白为什么。
<root>
<a/>
<b/>
<c><a/></c>
<a/>
</root>
<?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" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="root">
<!--this variable give me a sequence of "a" elements-->
<xsl:variable name="someElementA1" select="//a"/>
<xsl:variable name="someElementA2">
<xsl:copy-of select="//a"/>
</xsl:variable>
<xsl:for-each select="$someElementA1/a">
<xsl:element name="test">
<xsl:text>This is scenario 1: </xsl:text>
<xsl:apply-templates select="."/>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="$someElementA2/a">
<xsl:element name="test">
<xsl:text>This is scenario 2: </xsl:text>
<xsl:apply-templates select="."/>
</xsl:element>
</xsl:for-each>
<xsl:element name="test">
<xsl:text>This is scenario 3: </xsl:text>
<xsl:apply-templates select="$someElementA1"/>
</xsl:element>
<xsl:element name="test">
<xsl:text>This is scenario 4: </xsl:text>
<xsl:apply-templates select="$someElementA2/a"/>
</xsl:element>
</xsl:template>
<!--these are the templates to apply-->
<xsl:template match="a[parent::c]">
<xsl:text>This element has a parent</xsl:text>
</xsl:template>
<xsl:template match="a[parent::root]">
<xsl:text>This element is in the root element</xsl:text>
</xsl:template>
<xsl:template match="a">
<xsl:text>This element is in the sequence</xsl:text>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
输出:
<test>This is scenario 2: This element is in the sequence</test>
<test>This is scenario 2: This element is in the sequence</test>
<test>This is scenario 2: This element is in the sequence</test>
<test>This is scenario 3: This element is in the root elementThis element has a parentThis element is in the root element</test>
<test>This is scenario 4: This element is in the sequenceThis element is in the sequenceThis element is in the sequence</test>
Run Code Online (Sandbox Code Playgroud)
您得到的结果是由于以下事实:
节点序列包含节点在各自文档中的样子,而不是节点的副本。
<xsl:copy-of>
创建由属性中的表达式选择的每个节点的副本select
。
创建一个新的 XML 片段(临时树),这是变量的值$someElementA2
$someElementA1/a
Run Code Online (Sandbox Code Playgroud)
不选择任何节点,因为 中的所有元素都$someElementA1
没有名为 的子元素a
。
$someElementA2/a
Run Code Online (Sandbox Code Playgroud)
选择a
文档节点 ( /
) 的子级的所有元素。
归档时间: |
|
查看次数: |
1963 次 |
最近记录: |