2015-07-10 131 views
0

我有一個節點XSLT - 提取括號

<example> 
    Test1 (10) test2 (20) ... 
</example> 

內的字符串,我需要這種轉換爲:

<example> 
    Test1 <number>10</number> test2 <number>(20)</number> 
</example> 

因此我需要一個函數,將提取所有的文本(和)遞歸地。壞消息是我需要它在XSLT 1.0版中。

+0

在你的輸出,10已經失去了周圍的支架,而20仍然有他們。這是爲什麼? –

回答

1

您可以使用按名稱調用的遞歸模板,如下所示。請注意,如果遞歸深度過高,則遞歸模板可能會有問題。如果您的輸入文本包含幾千個parens,則XSLT處理器可能會因堆棧溢出而崩潰。這些錯誤非常難以調試。如果你只處理少量的parens,那麼遞歸的方法應該沒問題。

另請注意,我的示例不處理嵌套parens。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="example"> 
    <xsl:copy> 
     <xsl:call-template name="convert-parens"> 
      <xsl:with-param name="string" select="."/> 
     </xsl:call-template> 
    </xsl:copy> 
</xsl:template> 

<xsl:template name="convert-parens"> 
    <xsl:param name="string"/> 

    <xsl:choose> 
     <xsl:when test="contains($string, '(')"> 
      <xsl:variable name="after" select="substring-after($string, '(')"/> 
      <xsl:choose> 
       <xsl:when test="contains($after, ')')"> 
        <xsl:value-of select="substring-before($string, '(')"/> 
        <number> 
         <xsl:value-of select="substring-before($after, ')')"/> 
        </number> 
        <xsl:call-template name="convert-parens"> 
         <xsl:with-param name="string" select="substring-after($after, ')')"/> 
        </xsl:call-template> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of select="$string"/> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$string"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 
+0

您是否可以通過將兩個測試合併爲一個來避免嵌套的'xsl:choose'? –

+0

謝謝。這正是我需要的! – Luci0

+0

@ michael.hor257k是的,以犧牲另一個'substring-after'調用爲代價。 – nwellnhof

0

用正則表達式一個xsl:analyze-string,代碼可以更簡單:

<xsl:template match="example"> 
    <element> 
     <xsl:analyze-string select="text()" regex="[(][0-9][0-9][)]"> 
     <xsl:matching-substring> 
      <number> 
      <xsl:value-of select="substring(.,2,2)"/> 
      </number> 
     </xsl:matching-substring> 
     <xsl:non-matching-substring> 
      <xsl:value-of select="."/> 
     </xsl:non-matching-substring> 
     </xsl:analyze-string>  
    </element> 
    </xsl:template> 
+0

這個問題被標記爲XSLT 1.0,並且OP明確表示「*壞消息是我需要它在XSLT 1.0版本中。*」。您的答案需要XSLT 2.0。 –

+0

是的,它沒有在XSLT 1.0中實現..讀取太快請求時出錯 –