2012-03-16 97 views
0

給出的樣本XML數據:的XPath:串聯同級節點文本

<root> 
    <a> 
    <id>1</id> 
    <status>on</status> 
    <level>4</level> 
    <otherData>asdfasdfsdfvasdF</otherData> 
    <b> 
     <name>A1</name> 
    </b> 
    </a> 
    <a> 
    <id>2</id> 
    <status>on</status> 
    <level>8</level> 
    <otherData>asdfasdfsdfvasdF</otherData> 
    <b> 
     <name>TEST</name> 
    </b> 
    </a> 
    <a> 
    <id>3</id> 
    <status>off</status> 
    <level>2</level> 
    <otherData>asdfasdfsdfvasdF</otherData> 
    <b> 
     <name>A1</name> 
    </b> 
    </a> 
</root> 

我想寫的XPath表達式將計算爲:

 
1 on 
3 off 

也就是說,我想提取id節點的文本並將其與status節點連接起來。還有一個額外的條件:我只想在name爲「A1」的情況下執行此操作。 XPath表達式只得到了id是這樣的:

//name[text()="A1"]/../../id/text() 

而這裏來連接id與它的同胞status,這不工作的嘗試。

//name[text()="A1"]/../../concat(id/text() , status/text()) 

我試圖做甚至可能嗎?如果是這樣,那麼正確的XPath表達式是什麼?


澄清:我沒有做任何的轉換與此表達,我只是將其插入到XPath表達式求值(如在記事本++或JEDIT - 通過插件),以幫助在調試微妙的數據錯誤非常大的XML文件。在此示例中,如果b子元素具有name="A1",則idstatus的某些組合可能不正確,因此我試圖用一個簡單表達式來查找它們,而不是手動滾動文件。

回答

2

的XPath 2.0:

for $n in /root/a[b/name[.='A1']] return concat($n/id, ' ' , $n/status) 

結果:

1 on 
3 off 

Oxygen XML Editor測試,一個很好的工具恕我直言。

+0

嗯...我用於Notepad ++的插件似乎不支持XPath 2.0,也沒有JEdit插件(它們都給我「非法令牌」類型的錯誤)。你可以推薦哪些好的工具/編輯器來評估它?或者在Xpath 1.x中做到這一點,如果可能的話。 – FrustratedWithFormsDesigner 2012-03-16 19:59:30

+0

氧氣看起來像一個漂亮的漂亮的工具,但我不需要它的大部分功能,我不認爲我可以獲得這些許可證的預算。這真的只是我需要在我的工作站上進行調試和糾正XML文件,直到在幾周內修復生產。 – FrustratedWithFormsDesigner 2012-03-16 20:54:51

+1

XQuery基於XPath 2.0,並且有一個[jEdit XQuery插件](http://plugins.jedit.org/plugins/?XQuery)。我沒有測試過這個插件,它使用了一箇舊版本的Saxon(Saxon 7),但也許它可能會有用。 – mzjn 2012-03-17 09:31:32

0

試試這個。你只需要添加所需的格式)

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:template match="root"> 
    <xsl:apply-templates select="//name[text()='A1']"></xsl:apply-templates> 
    </xsl:template> 
    <xsl:template match="name[text()='A1']"> 
     <xsl:value-of select="../../id"/> 
     <xsl:text> </xsl:text> 
    <xsl:value-of select="../../status"/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

對不起,我應該更清楚一點:我沒有在樣式表中這樣做,我正在使用它來調試含有微妙數據錯誤的大型XML文件。 – FrustratedWithFormsDesigner 2012-03-16 19:12:52