如何从XML中提取特定部分

时间:2012-01-01 15:20:27

标签: jquery xml xslt xpath xquery

我有一个XML文件,我必须根据id属性提取特定部分。

输入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>

如果我将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)下面的项目立即生成,而不是任何深度。

2 个答案:

答案 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语法。