我有一个类似于以下内容的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>
答案 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表达式中。