对于输入 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 子树输入。如果您对此感兴趣,请告诉我。
- 正则表达式当前不容忍前面或后面的空格。