2016-10-08 49 views
1

我有一個看起來像下面的XML兄弟姐妹,的XPath忽略不匹配的屬性值

<?xml version="1.0"?> 
<root> 
<properties> 
    <property name="Name">Ananth</property> 
    <property name="Age">34</property> 
    <property name="Gender">Male</property> 
    <property name="Description">Blah blah</property> 
    100 other properties 
</properties> 
<properties> 
    <property name="Name">Peter</property> 
    <property name="Age">10</property> 
    <property name="Gender">Male</property> 
    <property name="Description">Blah blah</property> 
    100 other properties 
</properties> 
</root> 

我試圖讓僅匹配與名稱&年齡忽略了其他兄弟姐妹屬性的屬性。

//Property[@name='Name' or @name='Age']/.. 
//Property[@name='Name' or @name='Age']/parent::properties 

沒有找到我要找的東西。什麼是最好的XPath表達式會給我像

<?xml version="1.0"?> 
<properties> 
    <property name="Name">Ananth</property> 
    <property name="Age">34</property> 
</properties> 
<properties> 
    <property name="Name">Peter</property> 
    <property name="Age">10</property> 
</properties> 
+0

XPath無法選擇輸入XML中不存在的內容。您的目標'properties'元素不存在於輸入XML中。 – kjhughes

+0

感謝您指出另一個問題。 –

回答

0

通過您所期望的輸出,我看你是期望得到不是原來的properties節點,但只是property匹配的節點,因爲原來properties節點100點的屬性,和預期輸出properties節點剛剛2.

所以你需要一個雙XPath來正確地獲得預期的輸出:

第一:

properties/property[@name='Name' or @name='Age']/.. 

然後,對於每一個匹配properties節點,變換:

property[@name='Name' or @name='Age'] 

(注意,XPath表達式將返回普通列表零個或多個節點的,但不是一個樹結構節點,如你所期望的那樣)。

如果打算成爲一個XSL樣式表的一部分,完整的樣式表會是這樣:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" version="1.0" encoding="ISO-8859-1"/> 

<xsl:template match="/root"> 
<xsl:apply-templates select="properties/property[@name='Name' or @name='Age']/.."/> 
</xsl:template> 

<xsl:template match="properties"> 
<properties> 
<xsl:apply-templates select="property[@name='Name' or @name='Age']"/> 
</properties> 
</xsl:template> 

<xsl:template match="property"> 
<xsl:copy-of select="."/> 
</xsl:template> 

</xsl:stylesheet> 

更新

如果只過濾properties節點,你先試試應工作:

//property[@name='Name' or @name='Age']/.. 

只記得Xpath(如XML)是case sensi tiveproperty在您的輸入xml中爲小寫字母,因此必須位於xpath表達式中。

+0

我不想製作XSLT。我只是試圖過濾與xpath,expression不匹配屬性的其他屬性。 –

+0

我明白了。然後閱讀我的更新。 –