2017-04-18 141 views
0

我不是XSLT的專家。我有要求檢查所有「代碼」值,按照以下規則設置狀態碼。XSLT檢查每個元素的值和元素的設置值

  1. 如果所有代碼值是200,則設置的StatusCode 200和reasonphrase成功
  2. 如果所有代碼值是200或204,然後設置狀態碼200和reasonphrase是具有所有原因concatnatiopn代碼以外200
  3. 如果ATLEAST一個代碼包含比200和204的其它值,則設置的StatusCode至503和reasonphrase是所有原因concatnatiopn具有比200

我試圖幾個其他的代碼將所有代碼值存儲在一個變量中的方法可執行和可執行包含以上條件的函數,並創建代碼變量和存儲值,然後檢查字符串長度。但我沒有取得任何成功。

如果可能,我正在尋找一些更通用的方法,因爲此需求是複雜xslt的一部分,下面僅是需求的一個示例。 一旦我得到下面的代碼邏輯,我應該能夠適應複雜的xslt邏輯。

我也嘗試在答案中搜索,但無法獲得符合此要求的任何解決方案。

我要尋找的XSLT的其他部分在XSLT 1.0解決方案是用XSLT 1.0

輸入 -

  <root> 
       <Node1> 
         <code>200</code> 
         <reason>Success</reason> 
       </Node1> 
       <Node1> 
         <code>200</code> 
         <reason>Success</reason> 
       </Node1> 
       <Node1> 
         <code>204</code> 
         <reason>Business Error</reason> 
       </Node1> 
       <Node1> 
         <code>500</code> 
         <reason>Tech Error</reason> 
       </Node1> 
       <Node1> 
         <code>200</code> 
         <reason>Success</reason> 
       </Node1> 
      </root> 

輸出 -

  <root> 
      <output> 
       <statuscode></statuscode> 
       <reasonphrase></reasonphrase> 
      </output> 
      </root> 

謝謝。

+1

「我在xslt 1.0中尋找解決方案,因爲xslt的其他部分是用xslt 1.0編寫的」 - 這實際上並不是一個很好的理由。這有點像JDK 1.4,因爲應用程序的其他部分使用JDK 1.4。除了XSLT 1.0比JDK 1.4已經過時更久以外。 –

+0

是的,我同意。但XSLT將被集成到TIBCO代碼中。與整個TIBCO代碼相比,只有10%。所以,項目團隊可以使用xslt 1.0。 但是,謝謝你的回覆。 – Nilay

回答

0

嘗試以此爲起點:

XSLT 1.0

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

<xsl:template match="/root"> 
    <xsl:copy> 
     <output> 
      <xsl:choose> 
       <xsl:when test="not(Node1[code!=200])"> 
        <!-- all code values are 200 --> 
        <statuscode>200</statuscode> 
        <reasonphrase>success</reasonphrase> 
       </xsl:when> 
       <xsl:when test="not(Node1[code!=200 and code!=204])"> 
        <!-- all code values are either 200 or 204 --> 
        <statuscode>200</statuscode> 
        <reasonphrase> 
         <xsl:for-each select="Node1[code!=200]"> 
          <xsl:value-of select="code"/> 
          <xsl:if test="position()!=last()"> 
           <xsl:text> </xsl:text> 
          </xsl:if> 
         </xsl:for-each> 
        </reasonphrase> 
       </xsl:when> 
       <xsl:otherwise> 
        <statuscode>503</statuscode> 
        <reasonphrase> 
         <xsl:for-each select="Node1[code!=200]"> 
          <xsl:value-of select="code"/> 
          <xsl:if test="position()!=last()"> 
           <xsl:text> </xsl:text> 
          </xsl:if> 
         </xsl:for-each> 
        </reasonphrase> 
       </xsl:otherwise> 
      </xsl:choose> 
     </output> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

注意,這可以簡化,以消除重複的代碼 - 但這裏的關鍵是要展示如何測試對於給定的條件。

相關問題