2014-02-27 234 views
0

我必須添加元素Main/Years/Year/Notification/@UniqueId="27" & Main/Years/Year/@IsFailFlag = "Y",僅當Main/Years/Year/Month/Extn/@Flag !=''。 ,我必須複製Main/Years/Year/Month這種情況。Xsl:屬性添加基於子元素的元素屬性值

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> 

回答

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式的」(相同的結果):

<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> 
+0

我將與您的第一個解決方案。它更容易理解。您也可以提供網址w這裏可以學習xslt。我知道基本的東西 – 2FaceMan