XPath忽略与属性值

时间:2016-10-08 21:17:22

标签: xml xpath

我有一个类似于以下内容的XML,

<?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>

1 个答案:

答案 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)区分大小写:输入xml中的property为小写,因此必须位于xpath表达式中。