2012-01-02 16 views
1

根據建議,在單獨的線程中發佈此問題。現在的問題是一個延續,以下面的鏈接xslt根據配對的不同場景循環

xslt-loop-count-context-value-from-top-xml

我們希望產生如下XML作爲輸出(一些變化在outputxml)。標籤,「errorsandwarnings」應該是存在於殼體ATLEAST一個錯誤或警告的存在,「allerrors」標籤時ATLEAST一個錯誤存在時,「allwarnings」時ATLEAST一個警告存在標籤

<Root> 
    <errorsandwarnings> 
    <allerrors> 
     <error>apple</error> 
     <error>apple</error> 
    </allerrors> 
    <allwarnings> 
     <warning>apple</warning> 
    </allwarnings> 
    </errorsandwarnings> 
    <success>apple</success> 
</Root> 

回答

1

該轉化

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:variable name="vErrors" select= 
    "/*/Envelope[position() mod 2 = 1] 
        [(.|following-sibling::Envelope[1]) 
              /criticalerror 
        ]"/> 

    <xsl:variable name="vWarnings" select= 
    "/*/Envelope[position() mod 2 = 1] 
        [(.|following-sibling::Envelope[1]) 
               /milderror 
        ]"/> 

    <xsl:variable name="vErrorsWarnings" select= 
    "$vErrors | $vWarnings"/> 

    <xsl:variable name="vSuccess" select= 
     "/*/Envelope 
      [position() mod 2 = 1] 
       [not((.|following-sibling::Envelope[1]) 
        /*[self::criticalerror or self::milderror] 
       ) 
       ] 
    "/> 

    <xsl:template match="/*"> 
     <Root> 
      <xsl:if test="$vErrorsWarnings"> 
      <errorsandwarnings> 
      <xsl:apply-templates select="$vErrors"/> 
      <xsl:apply-templates select="$vWarnings"/> 
      </errorsandwarnings> 
      </xsl:if> 

      <xsl:apply-templates select="$vSuccess"/> 
     </Root> 
    </xsl:template> 

    <xsl:template match= 
     "Envelope 
     [position() mod 2 = 1 
     and 
     success 
     and 
     following-sibling::Envelope[1]/success 
     ]"> 

     <success> 
     <xsl:call-template name="getTitle"/> 
     </success> 
    </xsl:template> 

    <xsl:template match= 
     "Envelope 
     [position() mod 2 = 1 
     and 
     (.|following-sibling::Envelope[1])/criticalerror 
     ][1]"> 
     <allerrors> 
     <xsl:apply-templates mode="error" select="$vErrors"/> 
     </allerrors> 
    </xsl:template> 


    <xsl:template match="Envelope" mode="error"> 
     <error> 
     <xsl:call-template name="getTitle"/> 
     </error> 
    </xsl:template> 

    <xsl:template match= 
     "Envelope 
     [position() mod 2 = 1 
     and 
     (.|following-sibling::Envelope[1])/milderror 
     and 
     not((.|following-sibling::Envelope[1])/criticalerror) 
     ][1]"> 
     <allwarnings> 
     <xsl:apply-templates mode="warning" select="$vWarnings"/> 
     </allwarnings> 
    </xsl:template> 

    <xsl:template match="Envelope" mode="warning"> 
     <warning> 
     <xsl:call-template name="getTitle"/> 
     </warning> 
    </xsl:template> 

    <xsl:template name="getTitle"> 
     <xsl:value-of select= 
     "(.|following-sibling::Envelope[1]) 
      /Header/ineed[normalize-space()] 
              [1] 
     "/> 
    </xsl:template> 
    <xsl:template match="text()"/> 
</xsl:stylesheet> 

當在前面的問題提供的XML文檔應用:

<Root> 
    <Envelope> 
     <Header> 
      <ineed>apple</ineed> 
     </Header> 
     <success></success> 
    </Envelope> 
    <Envelope> 
     <Header> 
      <ineed>apple</ineed> 
     </Header> 
     <success></success> 
    </Envelope> 
    <Envelope> 
     <Header> 
      <ineed>apple</ineed> 
     </Header> 
     <criticalerror></criticalerror> 
    </Envelope> 
    <Envelope> 
     <Header> 
      <ineed>apple</ineed> 
     </Header> 
     <success></success> 
    </Envelope> 
    <Envelope> 
     <Header> 
      <ineed>apple</ineed> 
     </Header> 
     <criticalerror></criticalerror> 
    </Envelope> 
    <Envelope> 
     <Header> 
      <ineed>apple</ineed> 
     </Header> 
     <criticalerror></criticalerror> 
    </Envelope> 
    <Envelope> 
     <Header> 
      <ineed>apple</ineed> 
     </Header> 
     <milderror></milderror> 
    </Envelope> 
    <Envelope> 
     <Header> 
      <ineed>apple</ineed> 
     </Header> 
     <success></success> 
    </Envelope> 
</Root> 

產生想要的,正確的結果

<Root> 
    <errorsandwarnings> 
     <allerrors> 
     <error>apple</error> 
     <error>apple</error> 
     </allerrors> 
     <allwarnings> 
     <warning>apple</warning> 
     </allwarnings> 
    </errorsandwarnings> 
    <success>apple</success> 
</Root>