2014-03-25 30 views
-2

我有這樣的XML數據:如何使用xlst在元素內部分割xml數據?

<Invoice > 
    <cac:AllowanceCharge> 
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator> 

    <cbc:AllowanceChargeReason>ISK:y!#x!#w!#q!#t!#</cbs:AllowanceChargeReason> 

    <cbc:MultiplierFactorNumeric>0.1</cbc:MultiplierFactorNumeric> 
    </Invoice> 

我必須由!#字符拆分此AllowanceChargeReason,並把結果在陣列中。並與此數組循環,結果我想要得到這個結果。我如何爲以下結果編寫xslt代碼?

<table> 
<xsl:for-each > 
<tr> 
....... 
</tr> 
</xsl> 
</table> 

結果:

</table> 
    <table> 
    <tr> 
     <td> 
     y 
     </td> 
    <td> 
     x 
    </td> 
    <td> 
     w 
    </td> 
    <td> 
     q 
    </td> 
    </tr> 
    </table> 
+5

XSLT沒有「數組」類型。請顯示您正在使用的XML格式良好的樣本作爲輸入,您試圖實現的相應輸出以及迄今嘗試使用的XSLT。 –

+0

搜索* tokenize *。 –

+0

您可以使用XSLT 2.0還是僅限於1.0版本? –

回答

2

要在XSLT 1.0做到這一點,你需要創建一個命名模板,這將遞歸調用本身。這將需要作爲參數字符串分割,以及分隔符上分裂它

<xsl:template name="split"> 
    <xsl:param name="text" select="." /> 
    <xsl:param name="delimiter" select="'!#'" /> 

注意,在這種情況下,「選擇」中的參數值是默認值,如果沒有明確的參數,只適用被傳遞給模板。

在模板中,你會如果文本包含分隔符

<xsl:choose> 
    <xsl:when test="contains($text, $delimiter)"> 

如果是這樣的文字,你會輸出字符串的第一部分,使用substring-before然後遞歸調用使用substring-after

命名模板
<td><xsl:value-of select="substring-before($text, $delimiter)" /></td> 
    <xsl:call-template name="split"> 
     <xsl:with-param name="text" select="substring-after($text, $delimiter)" /> 
     <xsl:with-param name="delimiter" select="$delimiter" /> 
    </xsl:call-template> 

當文本不包含分隔符時,只輸出它。

例如,假設下面的XML

<Invoice> 
    <AllowanceChargeReason>ISK:y!#x!#w!#q!#t!#</AllowanceChargeReason> 
</Invoice> 

而下面的XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html" indent="yes"/> 
    <xsl:template match="AllowanceChargeReason"> 
     <table> 
      <tr> 
       <xsl:call-template name="split"> 
        <xsl:with-param name="text" select="substring-after(., ':')" /> 
       </xsl:call-template> 
      </tr> 
     </table> 
    </xsl:template> 

    <xsl:template name="split"> 
     <xsl:param name="text" select="." /> 
     <xsl:param name="delimiter" select="'!#'" /> 

     <xsl:if test="$text != ''"> 
      <xsl:choose> 
       <xsl:when test="contains($text, $delimiter)"> 
        <td><xsl:value-of select="substring-before($text, $delimiter)" /></td> 
        <xsl:call-template name="split"> 
         <xsl:with-param name="text" select="substring-after($text, $delimiter)" /> 
         <xsl:with-param name="delimiter" select="$delimiter" /> 
        </xsl:call-template> 
       </xsl:when> 
       <xsl:otherwise> 
        <td><xsl:value-of select="$text" /></td> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

再下面是輸出

<table> 
    <tr> 
     <td>y</td> 
     <td>x</td> 
     <td>w</td> 
     <td>q</td> 
     <td>t</td> 
    </tr> 
</table> 

請注意,您必須考慮到命名空間,當你將它應用到你的實際XML示例。

相關問題