我将以下数据作为输入:
<?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中实现这一目标的方法。有任何想法吗?我对此很陌生,所以对我很轻松(现在......)
答案 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
则不会创建该属性。