缓冲区中是否会为<xsl:apply-templates>生成任何树?我怎么能想象?</xsl:apply-templates>

时间:2012-07-17 20:07:18

标签: xml xslt xml-parsing xslt-1.0 xalan

我的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"/>

但未提及上述工作情况。怎么可能?)

1 个答案:

答案 0 :(得分:1)

这里有两个不同的问题:

1)模板匹配模式如何与源文档树的部分匹配?和

2)应用特定模板时的上下文节点是什么?

模板匹配模式与XPath表达式不同,即使它们看起来相似。特别是它们不假设任何当前上下文节点。 “Property / info”匹配父级为info元素的树中任何位置的Property元素。尽管这种匹配模式看起来与select="Property/info"中的XPath表达式相同,但它们却完全不同;后者将仅选择作为上下文节点的子元素的info元素子元素的Property元素。匹配模式不具有后一种限制,也不能,因为上下文节点的概念不会进入匹配匹配模式的规范。 (我想更准确地说,对于匹配模式,初始上下文节点是未指定的;它可以是<xsl:apply-templates> [明确或隐式]选择的任何节点。)

一旦选择了特定模板(通过匹配)以应用于特定节点,该节点就会成为上下文节点,因为评估了所选模板的内容。 (XSLT处理器不(概念上)将树的一部分复制到缓冲区中;上下文节点是原始源文档中的节点。)是的,您可以选择“../../*”因为您是从/root/Property/info的上下文节点开始。