XSLT用于根据节点属性删除重复节点

时间:2017-12-20 04:41:27

标签: xslt

我需要根据对其他元素值的选择删除完整的父节点。

我的XML是

<EAI>
    <SvcRS>
        <accountHeader>
            <errorHost>orgA</errorHost>
        </accountHeader>
        <accoutnDetails>
            <accountNumber>0000000111118800</accountNumber>
            <accountType>credit</accountType>
            <errorDetails>
                <code>111</code>
                <description>Account is not valid</description>
            </errorDetails>
        </accoutnDetails>
    </SvcRS>
    <SvcRS>
        <accountHeader>
            <errorHost>orgB</errorHost>
        </accountHeader>
        <accoutnDetails>
            <accountNumber>000111118800</accountNumber>
            <accountType>credit</accountType>
            <errorDetails>
                <code>0001</code>
                <description>Not enough balance</description>
            </errorDetails>
        </accoutnDetails>
    </SvcRS>
</EAI>

现在,我必须检查<errorHost>是否为orgA,然后检查相同的帐号111118800,我必须删除<accountDetails> orgB, XML可以有多个帐户,所以我必须删除orgB

的所有详细信息

我正在尝试很多选择,但似乎没有任何工作。

输出

<EAI>
    <accoutnDetails>
        <accountNumber>111118800</accountNumber>
        <accountType>credit</accountType>
        <errorHost>orgA</errorHost>
        <errorDetails>
            <code>111</code>
            <description>Account is not valid</description>
        </errorDetails>
    </accoutnDetails>
</EAI>

1 个答案:

答案 0 :(得分:0)

试试这个:

<?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

    <xsl:template match="accoutnDetails[errorHost = 'orgB' and //accountNumber = accoutnDetails[errorHost = 'orgA']/accountNumber]"/>

    </xsl:stylesheet>

请参阅http://xsltransform.hikmatu.com/b4GWV8

处的转化

更新后的查询请尝试:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

    <xsl:template match="SvcRS[accountHeader/errorHost = 'orgB' and accoutnDetails/accountNumber = //SvcRS[accountHeader/errorHost = 'orgA']/accoutnDetails/accountNumber]"/>

</xsl:stylesheet>

请参阅http://xsltransform.net/gVrtEmq

处的转化