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 代码,如果数字格式为(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"/>

请让我知道我怎样才能得到它。

谢谢

4

1 回答 1

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”组成的罗马数字。
  • 如果您有更多数字格式,则可以使用更通用的方法将解码实现为 a <xsl:for-each>,并将可用的数字格式作为 XML 子树输入。如果您对此感兴趣,请告诉我。
  • 正则表达式当前不容忍前面或后面的空格。
于 2013-11-15T11:23:04.260 回答