我有一个XML,其元素在不同的父元素上,我试图获得在xslt中使用// account [1]的第一个子元素,
但是我仍然从// account获得所有可用值。基本上// account和// account [1]给出相同的结果。
输入XMl1
<line>
<accountings>
<accounting>
<account>
<seg1>value1</seg2>
</account>
</accounting>
<accounting>
<account>
<seg1>value2</seg2>
</account>
</accounting>
</accountings>
</line>
输入xml2
<line>
<account>
<seg1>value1</seg1>
</account>
</line>
Xslt:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" omit-xml-declaration="yes" media-type="string"/>
<xsl:template match="/">
<xsl:variable name="hello" select="//*:account[1]/>
<xsl:element name="hello">
<xsl:value-of select="$hello/*:seg1"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
输入xml可以使用上述任何xml,这就是为什么我只能使用// account而不是完整的xpath的原因。
预期输出: 值1
我得到的实际输出 值1值2
答案 0 :(得分:2)
从 Xpath 2.0 specification:
路径表达式
//para[1]
与路径表达式/descendant::para[1]
的含义不同。后者选择第一个后代para
元素;前者选择所有后代para
元素,它们是各自父母的前para
个孩子。
答案 1 :(得分:1)
一个人仍然可以使用//
的缩写,但是可以使用括号显式更改[]
谓词的优先级:
使用:
(//account)[1]
这是:
//account
此表达式比/descendant::account
短,并且可读性更高。
相反,//account
的意思是:选择所有后代account
元素,它们是其父母的前account
个孩子。
因为,如 W3C XPath 1.0 Specification 中所定义:
// is short for /descendant-or-self::node()/