我的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
如果有人能找到一个非常好的解决方案。
谢谢。
答案 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 :
“•前一轴包含与该文档相同的所有节点 在文档顺序中的上下文节点之前的上下文节点, 排除任何祖先并排除属性节点和命名空间 节点“