匹配不同的数字格式

时间:2013-11-14 12:23:28

标签: xslt

我的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代码,如果数字是格式(i),则给出3,如果格式在(a)中,则为2,在最后一种情况下为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"/>

请让我知道我是如何得到它的。

由于

1 个答案:

答案 0 :(得分: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子树输入。如果您对此感兴趣,请告诉我。
  • 正则表达式目前不允许前后空格。