My input.xml如下所示:
<root>
<Property>
<info>
<Name>A</Name>
<Value>1000</Value>
</info>
<info>
<Name>B</Name>
<Value>2000</Value>
</info>
<info>
<Name>C</Name>
<Value>3000</Value>
</info>
</Property>
</root>
所以当我说-<xsl:apply-templates select="//Property/info">
树会是什么样子?我能把它想象成下图吗?
<Property>
<info>
<Name>A</Name>
<Value>1000</Value>
</info>
<info>
<Name>B</Name>
<Value>2000</Value>
</info>
<info>
<Name>C</Name>
<Value>3000</Value>
</info>
</Property>
当匹配模板时,我可以将Property元素作为树中的根元素吗?(当我执行它时,我想是的,并认为单独的树将在记忆中的某个地方创建——这是真的吗?(请解释))
<xsl:template match="Property/info"/>
这里我的实际问题是——模板是应用于缓冲区中的树(将其作为主树)还是应用于原始源树?
a) 如果事情是在缓冲树上计算/应用的,那么当我说时,我们应该无法检索根元素
<xsl:copy-of select="../../*"/>
因为缓冲树并没有根元素,处理器也不知道根元素。[但实际情况如何?]
b) 如果模板应用于原始源树,则
<xsl:template match="Property/info"/>
不应该正常工作吗?(正如我们应该以这种方式给出的:
<xsl:template match="root/Property/info"/>
或
<xsl:template match="//Property/info"/>
但没有如上所述提及其工作。这怎么可能?)
这里有两个单独的问题:
1) 模板匹配模式如何与源文档树的部分匹配?和
2) 应用特定模板时的上下文节点是什么?
模板匹配模式与XPath表达式不同,尽管它们看起来相似。特别地,它们不假设任何当前上下文节点。"Property/info"匹配树中任何父级为Property
元素的info
元素。尽管这个匹配模式看起来与select="Property/info"
中的XPath表达式相同,但它们有很大的不同;后者将仅选择作为CCD_ 6元素的子元素的CCD_。匹配模式没有后一种限制,也没有,因为上下文节点的概念没有进入匹配模式的规范中。(我想更准确的说法是,对于匹配模式,初始上下文节点是未指定的;它可以是<xsl:apply-templates>
[显式或隐式]选择的任何节点。)
一旦(通过匹配)选择了要应用于特定节点的特定模板,则在评估所选模板的内容时,该节点将成为上下文节点。(XSLT处理器不会(从概念上)将树的一部分复制到缓冲区中;上下文节点是原始源文档中的节点。)因此,是的,您可以选择"../../*",因为您是从/root/Property/info
的上下文节点开始的。