Ограничение букв, используемых в нумерации, сгенерированной xalan преобразованием - PullRequest
0 голосов
/ 11 июля 2019

Я ищу способ не использовать некоторые буквы в нумерации глав, сгенерированных 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) и некоторые другие). Есть ли способ запретить использование этих букв?

1 Ответ

1 голос
/ 11 июля 2019

Как я уже упоминал в комментариях, я не вижу способа "исправить" встроенный алгоритм 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

...