2014-11-01 28 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

相關問題