这是一个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 & Schuster</Publisher>
</Book>
我希望获得id
Book
的长度
我写道:
string-length(//Book/@id)
还有一个:
//Book/string-length(@id)
两者都有效,但我怀疑第二种方式是完全正确的。
答案 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>