【问题标题】:Iterating over a complex element in XML based on attributes using xslt使用 xslt 基于属性迭代 XML 中的复杂元素
【发布时间】:2014-02-11 18:39:04
【问题描述】:

我有一个如下所示的 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>

我的要求是遍历所有子节点下的条件元素。

如果 condition 元素的值为 true 那么我必须在 code 元素中获取相关值

预期输出:

<?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 并在条件元素的值为 true 时保留它以获取相关代码。

【问题讨论】:

    标签: xml xslt-1.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>
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我将动态评估条件,因此应用过滤器是不可行的。我必须迭代节点并根据条件评估获取代码。假设条件元素的值是“A=A”。我将使用 Evaluate() 函数对此进行评估。如果评估成功,我必须获取相关代码。我们如何在 XSLT 中实现这一点?
      • @Guru 您能否用您尝试使用的 XSLT 更新您的问题?什么评价函数?此外,您的问题没有说明“A = A”条件。这个 XPath 可以工作,并且可以根据您的需要以多种不同的方式进行修改。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多