使用XSLT组合两个xml记录

时间:2013-07-26 16:48:22

标签: xslt

我将以下数据作为输入:

<?xml version="1.0" encoding="UTF-8"?>
<orderbackup>
    <edprefinst paymentsystem="FirstData" amount="227.00000" refundmethod="VISA" backendriid="674256" />
    <edprefinst paymentsystem="FirstData" amount="227.00000" refundmethod="VISA" backendriid="663754" />
    <edprefinst paymentsystem="FirstData" amount="251.50000" refundmethod="VISA" backendriid="663304" />
    <ppcextdata attributename="account" searchvalue="XXXX" ppcpayinst_id="674256" />
    <ppcextdata attributename="account" searchvalue="YYYY" ppcpayinst_id="663754" />
    <ppcextdata attributename="account" searchvalue="ZZZZ" ppcpayinst_id="663304" />
</orderbackup>    

我想最终:

<edprefinst paymentsystem="FirstData" amount="227.00000" refundmethod="VISA" account="XXXX"/>
<edprefinst paymentsystem="FirstData" amount="227.00000" refundmethod="VISA" account="YYYY"/>
<edprefinst paymentsystem="FirstData" amount="251.50000" refundmethod="VISA" account="ZZZZ"/>

backendriid和ppcpayinst_id是一样的。我想从ppcextdata获取searchvalue,并通过将backendriid与ppcpayinst_id匹配来将其作为帐户添加到edprefinst

我无法想到在xslt中实现这一目标的方法。有任何想法吗?我对此很陌生,所以对我很轻松(现在......)

1 个答案:

答案 0 :(得分:0)

这是一个选项......

XML输入

<orderbackup>
    <edprefinst paymentsystem="FirstData" amount="227.00000" refundmethod="VISA" backendriid="674256" />
    <edprefinst paymentsystem="FirstData" amount="227.00000" refundmethod="VISA" backendriid="663754" />
    <edprefinst paymentsystem="FirstData" amount="251.50000" refundmethod="VISA" backendriid="663304" />
    <ppcextdata attributename="account" searchvalue="XXXX" ppcpayinst_id="674256" />
    <ppcextdata attributename="account" searchvalue="YYYY" ppcpayinst_id="663754" />
    <ppcextdata attributename="account" searchvalue="ZZZZ" ppcpayinst_id="663304" />
</orderbackup>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="/*">
        <xsl:apply-templates select="edprefinst"/>
    </xsl:template>

    <xsl:template match="edprefinst">
        <xsl:copy>
            <xsl:apply-templates select="@*[not(name()='backendriid')]|
                following-sibling::ppcextdata[@ppcpayinst_id=current()/@backendriid]/@searchvalue"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@searchvalue">
        <xsl:attribute name="account">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

</xsl:stylesheet>

<强>输出

<edprefinst paymentsystem="FirstData"
            amount="227.00000"
            refundmethod="VISA"
            account="XXXX"/>
<edprefinst paymentsystem="FirstData"
            amount="227.00000"
            refundmethod="VISA"
            account="YYYY"/>
<edprefinst paymentsystem="FirstData"
            amount="251.50000"
            refundmethod="VISA"
            account="ZZZZ"/>

我正在使用xsl:apply-templates而不是直接输出新的account属性,因此如果找不到相应的ppcextdata/@searchvalue则不会创建该属性。

相关问题