2009-07-21 104 views
2

我在編寫XPath表達式來選擇包含某些元素的節點時遇到問題,但排除了我不感興趣的此元素的兄弟節點。我懷疑這不能用XPath單獨完成,而且我將需要使用XSLT。XPath選擇

使用這個源文件

<items> 
    <item id="foo1"> 
     <attr1>val1</attr1> 
     <attr2>val2</attr2> 
     <attr3>val3</attr3> 
     <interestingAttribute>val4</interestingAttribute> 
    </item> 
    <item id="foo2"> 
     <attr1>val5</attr1> 
     <attr2>val6</attr2> 
     <attr3>val7</attr3> 
    </item> 
    <item id="foo3"> 
     <attr1>val8</attr1> 
     <attr2>val9</attr2> 
     <attr3>val10</attr3> 
     <interestingAttribute>val11</interestingAttribute> 
    </item> 
</items> 

我想產生這樣的結果

<items> 
    <item id="foo1"> 
     <interestingAttribute>val4</interestingAttribute> 
    </item> 
    <item id="foo3"> 
     <interestingAttribute>val11</interestingAttribute> 
    </item> 
</items> 

可以這樣使用XPath做了什麼?如果不是,我應該使用哪種XSLT轉換?

+0

你想生成你有以上的結果,整個XML?或者你是否只希望xpath中的特定節點能夠在代碼庫中運行? – 2009-07-21 15:21:24

+0

我寧願生成整個XML文檔。但是,如果有一個排除元素的XPath解決方案,那也不錯。 – Chris 2009-07-21 15:28:00

回答

4

XPath用於選擇特定的節點,它不會像你想要的那樣爲你提供樹形結構。最多可以從中獲取節點列表,並且從節點列表中可以導出樹結構。如果你真正想在這裏是選擇感興趣的屬性,你可以試試這個XPath:

/items/item/interestingAttribute 

如果你想生成的樹,你將需要XSLT。該模板應該這樣做:

<xsl:template match="/items"> 
    <xsl:copy> 
     <xsl:for-each select="item[interestingAttribute]"> 
      <xsl:copy> 
       <xsl:copy-of select="@* | interestingAttribute"/> 
      </xsl:copy> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 
2

這將只選擇<item> S作<interestingAttribute>孩子:

/items/item[interestingAttribute] 

或者你也可以選擇<interestingAttribute>元素本身就像這樣:

/items/item/interestingAttribute 

這兩個表達式會給你回一個節點 - 設置一個XML節點列表。如果您真的想將一個文檔轉換爲另一個文檔,您可能需要使用XSLT,但請記住XPath是XSLT的核心組件,因此您一定會使用上述XPath表達式來控制轉換。