从XSLT中的字符代码创建文本

从XSLT中的字符代码创建文本,xslt,escaping,ascii,Xslt,Escaping,Ascii,我正在将文档从一种XML标准转换为另一种XML标准。其中一个要求是,编号列表使用字母而不是罗马编号。我可以从列表位置创建unicode,但似乎无法将它们插入到XML输出中 也许我只是没有看到明显的解决办法。在JavaScript中,我将使用fromCharCode()函数,但在XSLT中还没有找到类似的选项 我使用的是XSL2.0,但如果需要的话,也可以使用3.0来简化工作 我创建了一个简单的XML+XSL来显示我需要解决的问题。实际文件太大,无法在此处共享 XML输入文档示例: <doc

我正在将文档从一种XML标准转换为另一种XML标准。其中一个要求是,编号列表使用字母而不是罗马编号。我可以从列表位置创建unicode,但似乎无法将它们插入到XML输出中

也许我只是没有看到明显的解决办法。在JavaScript中,我将使用fromCharCode()函数,但在XSLT中还没有找到类似的选项

我使用的是XSL2.0,但如果需要的话,也可以使用3.0来简化工作

我创建了一个简单的XML+XSL来显示我需要解决的问题。实际文件太大,无法在此处共享

XML输入文档示例:

<doc>
    <p>Some text</p>
    <p>Some more text</p>
</doc>

一些文本

更多的文字

所需输出:

<doc>
    <list>
        <list-item>
            <label>A</label>
            <p>Some text</p>
        </list-item>
        <list-item>
            <label>B</label>
            <p>Some more text</p>
        </list-item>
    </list>
</doc>

A.
一些文本

B 更多的文字

我试过这个:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">

<xsl:output method="xml" encoding="UTF-8"/>

<xsl:template match="/doc">
    <xsl:copy>
        <list>
            <xsl:apply-templates select="p"/>
        </list>
    </xsl:copy>
</xsl:template>

<xsl:template match="p">
    <xsl:variable name="number" as="xs:integer" select="position()"/>
    <list-item>
        <label>
            <xsl:value-of select="concat('&amp;#',$number + 65,';')" disable-output-escaping="yes"/>
        </label>
        <xsl:copy-of select="."/>
    </list-item>
</xsl:template>

</xsl:stylesheet>

我以前在其他生成的项上使用过禁用输出转义(例如,在XML输出中放入角括号),但似乎标准字符代码的处理方式不同。上述XSL的输出如下所示:

doc>
<list>
    <list-item>
        <label>&#66;</label>
        <p>Some text</p>
    </list-item>
    <list-item>
        <label>&#67;</label>
        <p>Some more text</p>
    </list-item>
</list>
</doc>
doc>
B
一些文本

C 更多的文字

有没有什么方法可以优雅地实现这一点(即,无需我创建一个庞大的xsl:choose调用所有可能的整数标签值,然后显式地创建字母标签?

您可以使用并让它将数字转换为字母

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    
    <xsl:template match="/doc">
        <xsl:copy>
            <list>
                <xsl:apply-templates select="p"/>
            </list>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="p">
        <list-item>
            <label>
                <xsl:value-of select="codepoints-to-string(position() + 64)"/>
            </label>
            <xsl:copy-of select="."/>
        </list-item>
    </xsl:template>
    
</xsl:stylesheet>

对于最大值为26('Z')的快速解决方案是


输出符合要求。

通过使用
div
xsl:if

使用
--p.S.这可以扩展到26*26。我相信你的意思是“阿拉伯语”,而不是“罗马”。是的,尽管我还必须创建罗马编号。:-)同样容易使用
。谢谢。这些都是非常有用的见解。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    
    <xsl:template match="/doc">
        <xsl:copy>
            <list>
                <xsl:apply-templates select="p"/>
            </list>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="p">
        <list-item>
            <label>
                <xsl:number format="A" value="position()"/>
            </label>
            <xsl:copy-of select="."/>
        </list-item>
    </xsl:template>
    
</xsl:stylesheet>
<xsl:template match="p">
    <xsl:variable name="alphabet" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>    
    <xsl:variable name="number" as="xs:integer" select="position()"/>
    <list-item>
        <label><xsl:value-of select="substring($alphabet,$number,1)"/></label>
        <xsl:copy-of select="."/>
    </list-item>
</xsl:template>