我有这样的XML
<root>
<el id="1" value="3"/>
<el id="2" value="3"/>
<el id="3" value="4"/>
<el id="4" value="4"/>
<el id="5" value="4"/>
<el id="6" value="4"/>
</root>
我想要一个xpath(我在c#上下文而不是xslt模板)获取值为4的第一个元素,即
<el id="3" value="4"/>
<el id="4" value="4"/>
with /root/el[position() <= 2 and @value=4]
我得到0个元素,因为position()基于父节点而不是当前子集。
我可以在c#中执行此操作,但是当我只需要20时,加载1200节点似乎没用。
由于
答案 0 :(得分:4)
以下适用于我的XSLT脚本;
<xsl:template match="/">
<xsl:apply-templates select="/root/el[@value=4][position()<=2]" />
</xsl:template>
结果是id 3和4,所以XPATH /root/el[@value=4][position()<=2]
应该适合你。
答案 1 :(得分:2)
@rsp的回答是正确的,但我想补充说明。 [cond1 and cond2]
等同于[cond1][cond2]
并不总是正确的。你需要第二种形式。
你的表达:
/root/el[position() <= 2 and @value=4]
...选择el
属性等于value
且位置小于或等于4
的所有2
元素。您的文档中没有这样的元素。
你想:
/root/el[@value=4][position() <= 2]
...首先选择el
属性等于value
的所有4
元素,然后根据需要按位置过滤。