XPath Query using包含多个值

时间:2010-02-04 03:21:54

标签: php xml xpath simplexml

我需要一个XPath,它将选择一个具有anattribute属性的子节点,该节点至少包含一个值列表。

示例XML

<mynodes>
  <theParentNode>
    <theChildNode name="one two" />
  </theParentNode>
    <theParentNode>
    <theChildNode name="one all" />
  </theParentNode>
    <theParentNode>
    <theChildNode name="two" />
  </theParentNode>
    <theParentNode>
    <theChildNode name="all" />
  </theParentNode>
</mynodes>

我想选择名称中包含“one”或“all”(或任何其他组合)的所有节点。这样返回的nodeList是:

<theParentNode>
  <theChildNode name="one two" />
</theParentNode>
<theParentNode>
  <theChildNode name="one all" />
</theParentNode>
<theParentNode>
  <theChildNode name="all" />
</theParentNode>

到目前为止,我的查询看起来像这样(注意我不使用架构):

//theChildNode[contains(tokenize(@name, '\s'), "one")]

这将使我的所有供应商元素在其name属性中包含“one”。但我不确定如何提供多个值来代替“一个”,然后是退回到theParentNode的最佳方式。我总是可以在php中完成所有这些,但是如果可能的话,我只需要使用XPath。

3 个答案:

答案 0 :(得分:4)

有点多余,但应该这样做:

//theChildNode[contains(tokenize(@name, '\s'), "one") or contains(tokenize(@name, '\s'), "all")]

答案 1 :(得分:1)

不确定获取多个属性值,但将选择器更改为

// theParentNode [theChildNode]

让所有父母都拥有子节点。

// theParentNode [theChildNode [含有....]]

无需升级,只选择有孩子的父母。

答案 2 :(得分:1)

我目前没有可用的XML测试环境,但你可能会追求这种可能性:

//theChildNode[intersect(tokenize(@name, '\s+'),('one','all'))]