【问题标题】:Xpath path helpXpath 路径帮助
【发布时间】:2010-07-09 10:21:16
【问题描述】:

我有以下 XML:

<products>
    <product>       
        <name>Flat Panel Monitor</name>
        <code>LS123</code>
        <attributes>
            <attribute>
                <group>Color</group>
                <values>
                    <value>Red</value>
                    <value>Blue</value>
                    <value>Green</value>
                </values>
            </attribute>
            <attribute>
                <group>Warranty</group>
                <values>
                    <value>5 Year</value>
                </values>
            </attribute>
        </attributes>
    </product>
</products>

我将使用什么 Xpath 来获取具有“颜色”组节点值的属性节点的所有值? /product/attributes/attribute/values/value 的标准 Xpath 将返回保修组中的所有值,包括值,但我需要将它们分开。

我猜在伪代码中我所说的是获取所有“值”,其中父节点“值”是节点“组”的兄弟节点,值为“颜色” - 希望这是可能的?

谢谢。

【问题讨论】:

  • 我喜欢这个问题已经产生了三个完全不同的工作答案。

标签: php xml xpath simplexml


【解决方案1】:

您需要使用方括号来过滤节点,因此: /product/attributes/attribute[group='Color']/values/value

【讨论】:

  • “方括号”保罗的意思是一个谓词
  • 谢谢乔希,这是对答案的一个非常有价值的补充。我应该把术语包括在内,这样他就可以查到了。
【解决方案2】:

您只需要那些group 'uncle' 为Colorvalue 节点,因此将其作为您已经制定的xpath 的条件:

/product/attributes/attribute/values/value[../../group = 'Color']

这表示要使value 节点有效,它必须有一个父节点和一个父节点以及一个值为Color 的子节点。

【讨论】:

  • 按照 Paul Butcher 的建议,对它们的共同祖先 &lt;attribute/&gt; 应用谓词更为正确。它的性能也更高,因为引擎不需要深入到树中然后返回到祖先。
  • @Josh,是的,这是一个更好的答案。
【解决方案3】:

另一种选择:

//value[ancestor::attribute[group='Color']]

【讨论】:

    【解决方案4】:
    //values[preceding-sibling::group[text()="Color"]]/value
    

    【讨论】: