Xsl:attribute根据子元素属性值添加元素

2人脸

我必须添加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>
JLRishe

这个怎么样:

<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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章