无论当前位置如何,如何获取所有前面的节点

时间:2013-05-09 14:53:46

标签: xslt nodes

我的XML结构

<root>
    <Q id="a">1</Q>
    <Q id="b">2</Q>
    <Q id="c">3</Q>
      <x> 
          <Q id="d">3.1</Q> 
          <Q id="e">3.2</Q>
          <Q id="f">3.3</Q>
      </x>
    <Q id="g">4</Q>
    <Q id="h">5</Q>
</root>

这是我的XPath表达式: // Q [@ ID = $ CurrentQid] /前述:: Q

我正在尝试获取前面Q个节点的列表而不管当前位置(我将当前位置作为参数传递给我的xslt) 当我在a,b,c,g,h节点上时,它返回正确的前面节点列表。我在上班的时候,如果它不能正常工作。

例如: 当我的当前节点是g它返回时, A,B,C,d,E,F 但是当我的当前节点是f时它只返回 d,E,F 虽然我期待它 A,B,C,d,E

如果有人能找到一个非常好的解决方案。

谢谢。

1 个答案:

答案 0 :(得分:2)

使用

($yourNode/preceding::Q | $yourNode/ancestor::Q)/@id 

基于XSLT的验证

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vQg" select="(//Q[@id='g'])[1]"/>
 <xsl:variable name="vQf" select="(//Q[@id='f'])[1]"/>

 <xsl:template match="/">
  "Preceding" $vQg:

  <xsl:for-each select=
  "($vQg/preceding::Q | $vQg/ancestor::Q)/@id">
   <xsl:value-of select="concat(., ' ')"/>
  </xsl:for-each>
=====================

  "Preceding" $vQf:

  <xsl:for-each select=
  "($vQf/preceding::Q | $vQf/ancestor::Q)/@id">
   <xsl:value-of select="concat(., ' ')"/>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<root>
    <Q id="a">1</Q>
    <Q id="b">2</Q>
    <Q id="c">3</Q>
      <x>
          <Q id="d">3.1</Q>
          <Q id="e">3.2</Q>
          <Q id="f">3.3</Q>
      </x>
    <Q id="g">4</Q>
    <Q id="h">5</Q>
</root>

XPath表达式被评估两次(对于你问题中的两个Q元素),结果的字符串值以空格分隔

  "Preceding" $vQg:

  a b c d e f 
=====================

  "Preceding" $vQf:

  a b c d e 

<强>解释

preceding::轴未按文档顺序选择所有前面的节点 - 要做到这一点,还需要使用ancestor::轴。

来自W3C XPath 1.0 specification

  

“•前一轴包含与该文档相同的所有节点   在文档顺序中的上下文节点之前的上下文节点,   排除任何祖先并排除属性节点和命名空间   节点