我的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"/>
这里我的实际Q是 - 模板应用于缓冲区中的树(将其作为主树)还是应用于原始源树?
a)如果在缓冲树上计算/应用了某些东西,我说
时我们就不能正确检索根元素<xsl:copy-of select="../../*"/>
因为缓冲树没有根元素,处理器不知道根元素。 [但实际上事情是如何运作的?]
b)如果模板应用于原始源树,则
<xsl:template match="Property/info"/>
不应该正常工作? (正如我们应该这样给出的:
<xsl:template match="root/Property/info"/>
或
<xsl:template match="//Property/info"/>
但未提及上述工作情况。怎么可能?)
答案 0 :(得分:1)
这里有两个不同的问题:
1)模板匹配模式如何与源文档树的部分匹配?和
2)应用特定模板时的上下文节点是什么?
模板匹配模式与XPath表达式不同,即使它们看起来相似。特别是它们不假设任何当前上下文节点。 “Property / info”匹配父级为info
元素的树中任何位置的Property
元素。尽管这种匹配模式看起来与select="Property/info"
中的XPath表达式相同,但它们却完全不同;后者将仅选择作为上下文节点的子元素的info
元素子元素的Property
元素。匹配模式不具有后一种限制,也不能,因为上下文节点的概念不会进入匹配匹配模式的规范。 (我想更准确地说,对于匹配模式,初始上下文节点是未指定的;它可以是<xsl:apply-templates>
[明确或隐式]选择的任何节点。)
一旦选择了特定模板(通过匹配)以应用于特定节点,该节点就会成为上下文节点,因为评估了所选模板的内容。 (XSLT处理器不(概念上)将树的一部分复制到缓冲区中;上下文节点是原始源文档中的节点。)是的,您可以选择“../../*”因为您是从/root/Property/info
的上下文节点开始。