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

时间:2019-07-11 10:45:16

标签: java xslt xalan

我正在寻找一种方法,以便在从.xml到.fo转换的xalan生成的章节编号中不包含某些字母。 我正在使用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)和其他一些字母)。 有没有办法禁止使用这些字母?

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的那样,我看不到“修复”内置xsl:number算法的方法,建议您用自己的算法替换。

在以下模板中,将alpha参数的值替换为您要使用的西里尔字母。其他一切都是自我调整。

请注意,输入编号应从零开始,因此请使用参数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