2012-11-19 49 views
4

我對XPATH相當陌生,當某個節點等於兩個值之一時,需要從多個XML對象返回一個值。該解決方案還需要使用local-name()作爲名稱空間不可知的。鑑於以下XML,我期待返回「A」等於「4」或「5」的所有「B」值。XPATH:使用通配符命名空間選擇多個記錄

<?xml version="1.0"?> 
    <element> 
     <A>3</A> 
     <B>Value 1</B> 
    </element> 
    <element> 
     <A>4</A> 
     <B>Value 2</B> 
    </element> 
    <element> 
     <A>5</A> 
     <B>Value 3</B> 
    </element> 

我曾嘗試下面的表達式的多次反覆,但似乎無法得到正確的語法,當我嘗試添加第二個值「A」。我似乎無法弄清楚「或」表達式的正確語法。我也考慮過使用聯合,並且無法獲得正確的語法。

這適用於何時「A」等於單個值「4」,但如何爲「5」值添加測試,以便結果返回兩個值「B」(「值2」和「價值3」)?

//*[local-name()='element'][*[local-name()='A']='4']/*[local-name()='B']/text() 

謝謝。任何幫助將非常感謝!

+1

有沒有強迫你使用的命名空間,不知道XPath的具體原因' – Tomalak

+0

從我被告知,正在生成主機XML並不總是爲數據提供相同的名稱空間。但是,到目前爲止,我只看到一個名稱空間名稱,所以我開始認爲這是不準確的信息。 – MNOPups

回答

5

嘗試這種情況:

//*[local-name() = 'element']/*[local-name() = 'A' and (. = 4 or . = 5)] 
    /../*[local-name() = 'B'] 

此表達式選擇Value 2Value 3

+1

+1完美。非常感謝! – MNOPups

+0

@knownups,不客氣! –

1

您可以嵌套謂詞。

 
//*[ 
    local-name() = 'element' and *[local-name() = 'A' and (. = 4 or . = 5)] 
]/*[ 
    local-name() = 'B' 
]/text() 

但在現實中,你應該使用的命名空間感知的XPath:

//ns1:element[ns2:A[. = 4 or . = 3]]/ns2:B/text() 
+0

此方法的工作原理如下,但我會看到我可以做些什麼來使其具有名稱空間感知功能。謝謝。 – MNOPups

3

治療命名空間的正確方法是寄存器他們與你的XPath API和... 使用他們在XPath表達式

使用

//x:element[x:A = 4 or x:A = 5]/x:B 

XSLT - 基於驗證

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:x="some:default NS"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="//x:element[x:A = 4 or x:A = 5]/x:B"/> 
</xsl:template> 
</xsl:stylesheet> 

當在下面的XML文檔(所提供的片段,通過具有默認名稱空間定義一個單一的頂部元件包裹施加這種轉變):

<t xmlns="some:default NS"> 
    <element> 
     <A>3</A> 
     <B>Value 1</B> 
    </element> 
    <element> 
     <A>4</A> 
     <B>Value 2</B> 
    </element> 
    <element> 
     <A>5</A> 
     <B>Value 3</B> 
    </element> 
</t> 

評估XPath表達式而本次評測的結果(選擇的節點)複製到輸出

<B xmlns="some:default NS">Value 2</B> 
<B xmlns="some:default NS">Value 3</B> 
+0

謝謝你的出色解釋。我相信這會在設置一些SoapUI測試時幫助我。 – MNOPups