2013-11-14 66 views
1

我在我的XML中有以下幾行。匹配不同的數字格式

<toc-item num="(i)"> 
<toc-item num="(ii)"> 
<toc-item num="(a)"> 
<toc-item num="(b)"> 
<toc-item num="1"> 
<toc-item num="2"> 

我需要一個XSLT代碼,這將使3如果數目在格式(I),2如果在格式(a)和1對最後一種情況。我已經嘗試了下面。但是,如果(i)或(a)是,則給予2。

<xsl:variable name="nu"> 
    <xsl:number format="(i)" level="any" /> 
</xsl:variable> 
<xsl:variable name="Brac"> 
    <xsl:choose> 
    <xsl:when test="contains(current()/@num,$nu)"> 
     <xsl:value-of select="3"/> 
    </xsl:when> 
    <xsl:when test="contains(current()/@num,'(')"> 
     <xsl:value-of select="2"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="1"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 
<xsl:value of select="$Brac"/> 

請讓我知道我能得到它。

由於

+0

這可以在XSLT 2.0中優雅地處理。你可以使用它嗎? –

+0

是的,我可以使用xslt 2.0 – user2423959

回答

1

對於輸入XML

<?xml version="1.0" encoding="ISO-8859-1"?> 
<numbers> 
    <toc-item num="(i)"/> 
    <toc-item num="(ii)"/> 
    <toc-item num="(a)"/> 
    <toc-item num="(b)"/> 
    <toc-item num="1"/> 
    <toc-item num="2"/> 
    <toc-item num="(2.x)"/> 
</numbers> 

以下XSLT 2.0

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

    <xsl:template name="get_number_type"> 
    <xsl:param name="number_string"/> 

    <xsl:analyze-string select="$number_string" regex="(^[0-9]+$)|(^\([a-h]\)$)|(^\([ivx]+\)$)"> 

     <xsl:matching-substring> 
     <xsl:choose> 
      <xsl:when test="regex-group(1) != ''"> 
      <xsl:text>1</xsl:text> 
      </xsl:when> 
      <xsl:when test="regex-group(2) != ''"> 
      <xsl:text>2</xsl:text> 
      </xsl:when> 
      <xsl:when test="regex-group(3) != ''"> 
      <xsl:text>3</xsl:text> 
      </xsl:when> 
     </xsl:choose> 
     </xsl:matching-substring> 

     <xsl:non-matching-substring> 
     <xsl:text>invalid</xsl:text> 
     </xsl:non-matching-substring> 

    </xsl:analyze-string> 

    </xsl:template> 

    <xsl:template match="toc-item"> 
    <xsl:text>The number format of string '</xsl:text> 
    <xsl:value-of select="@num"/> 
    <xsl:text>' is </xsl:text> 
    <xsl:call-template name="get_number_type"> 
     <xsl:with-param name="number_string" select="@num"/> 
    </xsl:call-template> 
    <xsl:text>.</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

產生的文本輸出

The number format of string '(i)' is 3. 
The number format of string '(ii)' is 3. 
The number format of string '(a)' is 2. 
The number format of string '(b)' is 2. 
The number format of string '1' is 1. 
The number format of string '2' is 1. 
The number format of string '(2.x)' is invalid. 

注:

  • 您甚至可能希望將模板轉換爲XSLT 2.0函數,以便更輕鬆地調用幫助器功能。
  • 當您的字母枚舉超出字母「h」時,羅馬數字會有點困難。所提供的正則表達式只適用於那裏,並且只適用於由數字「i」,「v」和「x」組成的羅馬數字。
  • 如果您有更多的數字格式,可以使用更通用的方法來將解碼實現爲<xsl:for-each>,並將可用的數字格式作爲XML子樹輸入。如果您對此感興趣,請告訴我。
  • 正則表達式當前不允許在空白空間之前或之後。
+0

非常感謝。這幫助了我很多。再次感謝。 – user2423959

+0

解決方案已更新,以處理數字格式無效的情況。此外,正則表達式被擴展爲顯式檢查數字字符串的開始('^')和結束('$')。 –