如何在XPath中查找特定类型的所有节点

Tha*_*i J 6 xpath xforms orbeon

假设我的view.xml中有以下表单数据实例:

<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
xmlns:exforms="http://www.exforms.org/exf/1-0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xhtml:head>
<xforms:instance id="instanceData">
    <form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <fruits>
     <fruit>
        <fruit-name>Mango</fruit-name>
     </fruit>
     <fruit>
        <fruit-name>Apple</fruit-name>
     </fruit>
     <fruit>
        <fruit-name>Banana</fruit-name>
     </fruit>
</fruits>
</form>
</xforms:instance>
</xhtml:head>
Run Code Online (Sandbox Code Playgroud)

我想从上面的实例中选择所有水果名称.我尝试了以下方法,但它总是选择第一个水果.

instance('instanceData')/fruits/fruit[*]/fruit-name
instance('instanceData')/fruits/fruit/fruit-name
instance('instanceData')/fruits/fruit[position()>0]/fruit-name
Run Code Online (Sandbox Code Playgroud)

请提供一种在XPATH中克服此问题的方法

Fur*_*edi 10

试试这个

             "//fruit-name"
Run Code Online (Sandbox Code Playgroud)

它将在文档层次结构中的任何位置找到所有水果名称.

  • @Alejandro,这并非总是正确的概括。如果XPath实现中有可供使用的元素索引(例如eXist数据库),则实际上写`// fruit-name`会更快!同样,在像这样的小实例上运行`// fruit-name`可能也没有什么不同。现实情况是哪种表达“最好”取决于几个因素。 (2认同)
  • @Alejandro:仅说某事不是一个好习惯是不够的。它背后必须有一些理由。一个好的使用索引的XPath优化器不需要遍历树句。而且,如果您真正想表达的是“找到文档中的每个“水果名称”元素,那么编写“ //水果名称”就可以准确地表达出来。 (2认同)