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

标签 java xslt xalan

我正在寻找一种方法,使 xalan 在 .xml 到 .fo 转换中生成的章节编号中不包含某些字母。 我正在使用 org.apache.xalan.xsltc.trax.TransformerFactoryImpl 将 .xml 文件转换为 .fo 文件,以便稍后从中生成 PDF。在 xml 文件中,我有一些编号的章节,如下所示:

<prcitem2 numbering="9">

它们在 .fo 中进行了如下转换: (此 block 位于 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)和其他一些字母)。 有没有办法禁止使用这些字母?

最佳答案

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

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

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

关于java - 限制 xalan 转换生成的编号中使用的字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56987443/

相关文章:

java - 匹配 URI 的特定部分

java - 如何优雅地处理Target Unreachable

xslt - 如何在我的 XSLT 文本输出中包含节点 XML?

xml - 使用 local-name() 获取 XSLT 中的第一个子节点

java - XALAN 注册扩展函数,就像 SAXON 中一样

java - 无法解析对象

Java 将 List<Vehicle> 转换为 List<Object>

c# - 获得不同的值(value);网络

xml - XSLT 能够做到这一点吗?

java - XSLT 文档() : Is it slower when calling it multiple times?