我必须添加元素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>
答案 0 :(得分:1)
这是怎么回事:
<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-esque”(同样的结果):
<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>