2014-11-01 61 views
0

实例:
XMLXpath - 如何控制每个元素的价值与他人?

<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,或不?

感谢您的回复。

+0

鉴于此示例XML,你想要什么的XPath返回? – har07 2014-11-01 21:58:35

+0

@ har07 - 可能是真/假...每个b是相同或不相同的。我知道,它在这里并没有多大的意义,实际上我需要它作为属性。 – 2014-11-01 22:31:07

+0

只说*“但它不起作用”*没有准确地告诉它为什么不起作用并且没有提供代码示例是不好的风格要求。特别是如果您对正确的技术措辞感到不确定,则显示您的代码示例可以提供很多帮助。 – hakre 2014-11-02 10:51:51

回答

2

为了得到不同的值的数量为所有/*/a/b元素节点,则可以指望这些元件的不同值:

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

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

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 
+0

非常漂亮,应该会更快我猜...也非常感谢你。 – 2014-11-02 11:14:52

1

如果你所说的“控制”,你真的想有一个布尔返回值告诉你,如果所有<b>元素具有相同的值,你可以用这个表达:

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

它决定了<b>的其价值不像其他<b>的价值。如果计数大于1,则至少有一个b不匹配,因此表达式将为false。如果结果集为空,计数将为0,表达式将为true

此答案受How can I use XPath to find the minimum value of an attribute in a set of elements?启发。

+0

现在我明白了,非常感谢您的回复! – 2014-11-02 11:01:19

相关问题