使用xslt基于属性迭代XML中的复杂元素

时间:2014-02-07 12:30:22

标签: xml xslt-1.0

我有一个XML数据,如下所示

输入XML

                <?xml version = "1.0" encoding = "UTF-8"?>
                <Root>
                    <Child ID = "1">
                        <condition>true</condition>
                        <code>Error-1</code>
                    </Child>
                    <Child ID = "2">
                        <condition>false</condition>
                        <code>Error-2</code>
                    </Child>
                    <Child ID = "3">
                        <condition>true</condition>
                        <code>Error-3</code>
                    </Child>
                    <Child ID = "4">
                        <condition>false</condition>
                        <code>Error-4</code>
                    </Child>
                    <Child ID = "5">
                        <condition>true</condition>
                        <code>Error-5</code>
                    </Child>
                    <Child ID = "6">
                        <condition>true</conditions>
                        <code>Error-6</code>
                    </Child>
                    <Child ID = "7">
                        <condition>false</condition>
                        <code>Error-7</code>
                    </Child>
                </Root>

我的要求是迭代所有子节点下的conditions元素。

如果条件元素的值为 true ,那么我必须在代码元素中获取相关值

预期产出:

<?xml version = "1.0" encoding = "UTF-8"?>
    <code>Error-1</code>
    <code>Error-3</code>
    <code>Error-5</code>
    <code>Error-6</code>

我一直在尝试根据子节点的属性 ID 执行此操作。当遍历条件元素时,如何获取其父节点的属性 ID (即子元素)并保留它以获取条件元素的值为真的相关代码。

2 个答案:

答案 0 :(得分:1)

您需要以下样式表:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Child">
        <xsl:if test="condition[.='true']">
            <xsl:apply-templates select="code"/>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

不知道您正在使用的XSLT的上下文我可以说您可以使用正确的XPath轻松完成此任务。

Root/Child[condition='true']/code

只要使用正确的谓词,就可以根据需要调整上下文。

相关问题