Как л oop через алфавит с XSLT? - PullRequest
1 голос
/ 27 января 2020

Мне нужно создать динамическую c таблицу XSL-FO в XSLT 2.0, которая выглядит примерно так:

+------+------+------+------+------+------+
|      |   1  |  2   |  3   |  4   |   5  |
+------+------+------+------+------+------+
|   A  |      |      |      |      |      |
+------+------+------+------+------+------+
|   B  |      |      |      |      |      |
+------+------+------+------+------+------+
|   C  |      |      |      |      |      |
+------+------+------+------+------+------+
|   D  |      |      |      |      |      |
+------+------+------+------+------+------+
|   E  |      |      |      |      |      |
+------+------+------+------+------+------+

Обе конечные точки (строки, столбцы) являются динамическими c и указывается последней цифрой / буквой в исходных данных.

<input>
    <end-stop-column>5</end-stop-column>
    <end-stop-row>E</end-stop-row>
</input>

Я думал о for-each подходе (псевдокод):

<fo:table>
    <fo:table-body>
        <fo:table-row>
            <fo:table-cell><fo:block></fo:block></fo:table-cell>
            <xsl:for-each select="1 to 5">
                <xsl:variable name="colid" select="current()"/>
                <fo:table-cell><fo:block><xsl:value-of select="$colid"/></fo:block></fo:table-cell>
            </xsl:for-each>
        </fo:table-row>
        <xsl:for-each select="A to E">
            <xsl:variable name="rowid" select="current()"/>
            <fo:table-row>
                <fo:table-cell><fo:block><xsl:value-of select="$rowid"/></fo:block></fo:table-cell>                    <xsl:for-each select="1 to 5">
                    <xsl:variable name="colid" select="current()"/>
                    <fo:table-cell>
                        <fo:block>
                            <xsl:text>Value for </xsl:text>
                            <xsl:value-of select="$rowid"/>
                            <xsl:text> </xsl:text>
                            <xsl:value-of select="$colid"/>
                        </fo:block>
                    </fo:table-cell>
                </xsl:for-each>
            </fo:table-row>
        </xsl:for-each>
    </fo:table-body>
</fo:table>

Вышеприведенный XSLT не работает, потому что for-each в контексте in может обрабатывать только цифры.

Как обрабатывать буквы в строках? Строки могут не останавливаться на Z и начинаться заново с ZA, ZB, ..., ZZ, ZZA, ....

1 Ответ

2 голосов
/ 27 января 2020

Используйте сопоставление букв и цифр, если достаточно string-to-codepoints(end-stop-row) (https://www.w3.org/TR/xpath-functions/#func -строка-к-точкам ) (зависит от алфавита, который вы имеете в виду), используйте это. Форматирование чисел, которые вы обрабатываете на втором шаге в виде букв, может быть обработано с помощью xsl:number или format-number.

...