【问题标题】:Xpath - how control every element value with others?Xpath - 如何与其他元素一起控制每个元素的值?
【发布时间】:2014-11-01 19:58:48
【问题描述】:

示例:
我的 XML

<root>
    <a>
        <b>1</b>
        <b>1</b>
        <b>2</b>
    </a>
    <a>
        <b>1</b>
        <b>2</b>
    </a>
    <a>
        <b>1</b>
    </a>
</root>
  • A 现在,如何控制每个“b”元素只有一个相同的值(不仅仅是“1”)?
  • 有可能吗?我只找到了,但它不起作用://a/b != ./b
  • 除了元素中的一些循环或按值计数之外,我不知道......但它不能在 xpath 中,或者不是?

感谢您的回复。

【问题讨论】:

  • 给定这个示例 XML,您希望 XPath 返回什么?
  • @har07 - 可能是真/假...每个 b 是否相同。我知道,它在这里没什么意义,实际上我需要它作为属性。
  • 只说明 “但它不起作用” 没有确切说明它为什么不起作用并且不提供代码示例不是很好的提问方式。尤其是如果您不确定正确的技术措辞,展示您的代码示例会很有帮助。

标签: xml loops xpath xsd schematron


【解决方案1】:

要获取所有 /*/a/b 元素节点的不同值的数量,您可以计算这些元素的不同值:

count(/*/a/b[not(. = preceding::b)])

如果有一个不同的值,则此表达式将返回 1,如果有两个(如您的情况)则返回 2,如果文档中没有 /*/a/b 元素,则返回 0。

PHP 示例:

<?php

$buffer = <<<XML
<root>
    <a>
        <b>1</b>
        <b>1</b>
        <b>2</b>
    </a>
    <a>
        <b>1</b>
        <b>2</b>
    </a>
    <a>
        <b>1</b>
    </a>
</root>
XML;

$doc = new DOMDocument();
$doc->loadXML($buffer);
$xpath = new DOMXPath($doc);

echo $xpath->evaluate('count(/*/a/b[not(. = preceding::b)])');  # echoes 2

【讨论】:

  • 非常漂亮,我想应该会更快......也非常感谢。
【解决方案2】:

如果您所说的“控制”是指您实际上想要一个布尔返回值来告诉您是否所有 &lt;b&gt; 元素都具有相同的值,您可以使用这个表达式:

count(/root/a/b[. != ../b]) = 0

它确定&lt;b&gt; 的值与其他&lt;b&gt; 的值不同。如果计数大于 1,则至少有一个 b 不匹配,因此表达式将为 false。如果结果集为空,则计数为 0,表达式为 true

这个答案的灵感来自How can I use XPath to find the minimum value of an attribute in a set of elements?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2011-07-10
    • 2017-03-16
    相关资源
    最近更新 更多