可以在XPath分隔符后给出一个函数吗?

时间:2013-06-28 06:18:03

标签: xpath-2.0

这是一个XML .......

<Book id="isbn-0-671-21280-X">
    <Title>How to Read a Book</Title>
    <Subtitle>The Classic Guide to Intelligent Reading</Subtitle>
    <Author>Mortimer J. Adler</Author>
    <Author>Charles Van Doren</Author>
    <Date>1940</Date>
    <Publisher>Simon &amp; Schuster</Publisher>
</Book>

我希望获得id

的属性Book的长度

我写道:

string-length(//Book/@id)

还有一个:

//Book/string-length(@id)

两者都有效,但我怀疑第二种方式是完全正确的。

2 个答案:

答案 0 :(得分:1)

在XPath 2中,两种方式都是正确的

您不应再将/视为路径,而更像是地图运算符。将右侧的函数应用于序列中每个元素的左侧。

你甚至可以做像

这样的事情
//Book/(a-function-that-returns-nodes() | b-function-that-returns-nodes())/../..

答案 1 :(得分:1)

这两种函数调用之间存在差异。 string-length(//some/expression)获取路径表达式的所有结果,然后计算字符串长度,//some/expression/string-length()将返回该表达式的每个匹配结果的字符串长度。

由于您的XML只包含一本书,因此两个版本都会产生相同的结果。如果有多本书,第一个查询将返回所有书籍的总计字符串长度,第二个将返回每本书标识符的字符串长度。


您也可以写//book/@id/string-lenght()而不是//Book/string-length(@id),因为可能没有多个@id属性,因为其他属性(或子元素)与上述相同。< / p>