我必须添加Element Main/Years/Year/Notification/@UniqueId="27"
&Main/Years/Year/@IsFailFlag = "Y"
,仅当时Main/Years/Year/Month/Extn/@Flag !=''
。Main/Years/Year/Month
对于这种情况,我必须复制。
XML
<?xml version="1.0" encoding="UTF-8"?>
<Main>
<Years>
<Year>
<Month ActualDate="" Type="C" FailText="">
<Extn Flag="A" />
<Details>
<Line A="a" B="3" C="1" />
</Details>
</Month>
<Month ActualDate="" Type="C" FailText="">
<Extn Flag="B" />
<Details>
<Line A="a" B="3" C="1" />
</Details>
</Month>
<Month ActualDate="" Type="C" FailText="">
<Extn Flag="" />
<Details>
<Line A="a" B="3" C="1" />
</Details>
</Month>
</Year>
</Years>
</Main>
我的XSL
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/">
<LoadShipment>
<xsl:for-each select="/Main/Years/Year/Month/Extn">
<xsl:if test="@Flag != ''">
<xsl:attribute name="IsFailFlag">
<xsl:value-of select="'Y'" />
</xsl:attribute>
<Notification>
<xsl:attribute name="UniqueId">
<xsl:value-of select="'27'" />
</xsl:attribute>
</Notification>
<xsl:copy-of select=".." />
</xsl:if>
</xsl:for-each>
</LoadShipment>
</xsl:template>
</xsl:stylesheet>
我不断收到通知,因为它在for循环内部,我无法将其移出,因为无论情况如何,它将始终被填充
输出
<?xml version="1.0" encoding="UTF-8"?>
<LoadShipment IsFailFlag="Y">
<Notification UniqueId="27" />
<Month ActualDate="" Type="C" FailText="">
<Extn Flag="A" />
<Details>
<Line A="a" B="3" C="1" />
</Details>
</Month>
<Notification UniqueId="27" />
<Month ActualDate="" Type="C" FailText="">
<Extn Flag="B" />
<Details>
<Line A="a" B="3" C="1" />
</Details>
</Month>
</LoadShipment>
预期产量
<?xml version="1.0" encoding="UTF-8"?>
<LoadShipment IsFailFlag="Y">
<Notification UniqueId="27" />
<Month ActualDate="" Type="C" FailText="">
<Extn Flag="A" />
<Details>
<Line A="a" B="3" C="1" />
</Details>
</Month>
<Month ActualDate="" Type="C" FailText="">
<Extn Flag="B" />
<Details>
<Line A="a" B="3" C="1" />
</Details>
</Month>
</LoadShipment>
这个怎么样:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/">
<xsl:variable name="badMonths"
select="Main/Years/Year/Month[Extn/@Flag != '']" />
<LoadShipment>
<xsl:if test="$badMonths">
<xsl:attribute name="IsFailFlag">Y</xsl:attribute>
<Notification UniqueId="27" />
<xsl:copy-of select="$badMonths" />
</xsl:if>
</LoadShipment>
</xsl:template>
</xsl:stylesheet>
在样本输入上运行时,结果为:
<LoadShipment IsFailFlag="Y">
<Notification UniqueId="27" />
<Month ActualDate="" Type="C" FailText="">
<Extn Flag="A" />
<Details>
<Line A="a" B="3" C="1" />
</Details>
</Month>
<Month ActualDate="" Type="C" FailText="">
<Extn Flag="B" />
<Details>
<Line A="a" B="3" C="1" />
</Details>
</Month>
</LoadShipment>
或采用另一种方式,有点像“ XSLT风格”(相同的结果):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" 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:variable name="badMonths"
select="Years/Year/Month[Extn/@Flag != '']" />
<LoadShipment>
<xsl:apply-templates select="(.)[$badMonths]" mode="failed" />
<xsl:apply-templates select="$badMonths" />
</LoadShipment>
</xsl:template>
<xsl:template match="*" mode="failed">
<xsl:attribute name="IsFailFlag">Y</xsl:attribute>
<Notification UniqueId="27" />
</xsl:template>
</xsl:stylesheet>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句