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)

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

4

2 回答 2

1

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

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

你甚至可以做类似的事情

//Book/(a-function-that-returns-nodes() | b-function-that-returns-nodes())/../..
于 2013-06-28T09:02:33.780 回答
1

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

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


您也可以写//book/@id/string-lenght()而不是,//Book/string-length(@id)因为可能不超过一个@id属性,对于其他属性(或子元素),上述相同将适用。

于 2013-06-28T09:15:56.713 回答