1

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

但没有提到它的工作原理。这怎么可能?)

4

1 回答 1

1

这里有两个单独的问题:

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

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

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

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

于 2012-07-17T21:09:44.713 回答