无法从xslt获取// account [1]的首次出现元素

时间:2019-07-12 18:31:20

标签: xml xslt xslt-2.0

我有一个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

2 个答案:

答案 0 :(得分:2)

Xpath 2.0 specification

  

路径表达式//para[1]与路径表达式/descendant::para[1]的含义不同。后者选择第一个后代para元素;前者选择所有后代para元素,它们是各自父母的前para个孩子。

答案 1 :(得分:1)

一个人仍然可以使用//的缩写,但是可以使用括号显式更改[]谓词的优先级:

使用

(//account)[1]

这是

  1. 选择序列//account
  2. 从该顺序中选择第一项

此表达式比/descendant::account短,并且可读性更高。

相反,//account的意思是:选择所有后代account元素,它们是其父母的前account个孩子。

因为,如 W3C XPath 1.0 Specification 中所定义:

// is short for /descendant-or-self::node()/