限制 xalan 转换生成的编号中使用的字母

Restricting the letters used in a numbering generated by a xalan transformation

我正在寻找一种方法,使 xalan 在 .xml 到 .fo 转换中生成的章节编号中没有某些字母。 我正在使用 org.apache.xalan.xsltc.trax.TransformerFactoryImpl 将 .xml 文件转换为 .fo 文件,以便稍后从中制作 PDF。在 xml 文件中,我有一些像这样编号的章节:

<prcitem2 numbering="9">

它们在 .fo 中的转换方式如下: (此块位于 fo:list-item-label 内,位于 fo:list-item 内,但我在移动设备上无法正确编辑它。抱歉)

<fo:block>Й.</fo:block>

负责转换的xsl是:

<xsl:when test="ancestor-or-self::prcitem2">
<xsl:choose>
<xsl:when test="($language = 'ru')">
<xsl:number count="prcitem2" format="А."/>
</xsl:when>
</xsl:choose>

但是我的俄罗斯同志告诉我,他们的一些字母不能用于编号,因为 ATA 和俄罗斯标准不允许这样做(例如 Й、З(不是 3)和其他一些字母)。 有没有办法禁止使用这些字母?

正如我在评论中提到的,我看不到 "fix" built-in xsl:number 算法的方法,我建议您用自己的算法替换它。

在以下模板中,将 alpha 参数的值替换为您要使用的西里尔字符。其他都是 self-adjusting.

请注意,输入编号应从零开始,因此调用模板时 decimal 参数的值为 = "$your-number - 1"

<xsl:template name="dec-to-alpha">
    <xsl:param name="decimal"/> 
    <xsl:param name="alpha" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
    <xsl:variable name="base" select="string-length($alpha)"/>
    <xsl:variable name="bit" select="$decimal mod $base"/>
    <xsl:variable name="char" select="substring($alpha, $bit + 1, 1)"/>
    <xsl:variable name="next" select="floor($decimal div $base)"/>
    <xsl:if test="$next">
        <xsl:call-template name="dec-to-alpha">
            <xsl:with-param name="decimal" select="$next - 1"/>
        </xsl:call-template>
    </xsl:if>
    <xsl:value-of select="$char"/>
</xsl:template>

演示https://xsltfiddle.liberty-development.net/94rmq74