限制 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>
我正在寻找一种方法,使 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>