我有一个XML文件,我必须根据id属性提取特定部分。
<root>
<item id="id_1" state="closed">
<content>
<name>Details</name>
</content>
<item state="closed" id="id_1_1">
<content>
<name title="Name">Identity</name>
</content>
<item id="id_1_1_1" state="closed">
<content>
<name title="Name">Name</name>
</content>
<item id="id_1_1_1_1">
<content>
<name title="First Name">First Name</name>
</content>
</item>
<item id="id_1_1_1_2">
<content>
<name title="Last Name">Last Name</name>
</content>
</item>
</item>
<item id="id_1_1_2" state="closed">
<content>
<name title="Address">Address</name>
</content>
<item id="id_1_1_2_1">
<content>
<name title="Address Line 1">Line 1</name>
</content>
</item>
<item id="id_1_1_2_2">
<content>
<name title="Address Line 2">Line 2</name>
</content>
</item>
<item id="id_1_1_2_3">
<content>
<name title="City">City</name>
</content>
</item>
</item>
</item>
<item>
</root>
如果我将id_1_1作为输入,则输出xml应如下所示
<item id="id_1_1_1" state="closed">
<content>
<name title="Name">Name</name>
</content>
</item>
<item id="id_1_1_2" state="closed">
<content>
<name title="Address">Address</name>
</content>
</item>
输出应该使所选节点(输入id)下面的项目立即生成,而不是任何深度。
答案 0 :(得分:1)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="text()"/>
<xsl:template match="item[@id='id_1_1']/item">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:copy-of select="content"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML (略微更正以使格式正确!):
<root>
<item id="id_1" state="closed">
<content>
<name>Details</name>
</content>
<item state="closed" id="id_1_1">
<content>
<name title="Name">Identity</name>
</content>
<item id="id_1_1_1" state="closed">
<content>
<name title="Name">Name</name>
</content>
<item id="id_1_1_1_1">
<content>
<name title="First Name">First Name</name>
</content>
</item>
<item id="id_1_1_1_2">
<content>
<name title="Last Name">Last Name</name>
</content>
</item>
</item>
<item id="id_1_1_2" state="closed">
<content>
<name title="Address">Address</name>
</content>
<item id="id_1_1_2_1">
<content>
<name title="Address Line 1">Line 1</name>
</content>
</item>
<item id="id_1_1_2_2">
<content>
<name title="Address Line 2">Line 2</name>
</content>
</item>
<item id="id_1_1_2_3">
<content>
<name title="City">City</name>
</content>
</item>
</item>
</item>
</item>
</root>
生成想要的正确结果:
<item id="id_1_1_1" state="closed">
<content>
<name title="Name">Name</name>
</content>
</item>
<item id="id_1_1_2" state="closed">
<content>
<name title="Address">Address</name>
</content>
</item>
答案 1 :(得分:0)
这个XPath:
//item[@id="id_1_1"]/item/content/name
将选择仅适用于具有匹配name
属性值的任何级别的item
元素的直接子项的所有id
元素。
修改:如果您需要item
元素,请使用
//item[@id="id_1_1"]/item
然后使用
./content/name
在迭代期间选择那些直接子项。
此外,由于您添加了一个提及jQuery的后续评论,请注意其"attribute equals selector"在属性名称中不使用@
符号,也不使用完整的XPath语法。