我需要一个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。
答案 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'))]