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

时间:2011-03-03 11:09:23

标签: 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>

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

instance('instanceData')/fruits/fruit[*]/fruit-name
instance('instanceData')/fruits/fruit/fruit-name
instance('instanceData')/fruits/fruit[position()>0]/fruit-name

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

3 个答案:

答案 0 :(得分:7)

试试这个

             "//fruit-name"

它将在文档层次结构中找到所有水果名称。

答案 1 :(得分:3)

如果您要从实例<fruit-name>instanceData)中选择所有<xforms:instance id="instanceData">,看起来就像您在问题中所拥有的那样,则应执行以下操作:

instance('instanceData')/fruits/fruit/fruit-name

如果这不起作用,一个常见原因是您在包含实例的文档中有一个默认命名空间声明,例如:xmlns="http://www.w3.org/1999/xhtml"。如果您有此,则需要在声明实例的位置撤消该默认命名空间声明,并使用:

<xforms:instance xmlns="" id="instanceData">

(如果这是问题,我建议不要使用默认的名称空间声明。永远。而是声明xmlns:xhtml="http://www.w3.org/1999/xhtml"并在任何地方使用xhtml前缀。)

答案 2 :(得分:0)

第一:  它可能是一个错字任何方式指出你xml有错误的节点结束

<service>

第二:  你的XPATH是非常有效的,但是当你解析它时,你需要迭代结果集,就像它的节点序列而不是单个值一样。

例如,在JDOM中:&lt; Element.selectObject和selectSingleNodes对selectAsArray类型。

在您的XForms中,您需要遍历结果集以获取结果列表。

如果您只想要水果名称,那么您可以尝试

instance('instanceData')/fruits/fruit/fruit-name/text()