从XSLT中的字符代码创建文本
我正在将文档从一种XML标准转换为另一种XML标准。其中一个要求是,编号列表使用字母而不是罗马编号。我可以从列表位置创建unicode,但似乎无法将它们插入到XML输出中 也许我只是没有看到明显的解决办法。在JavaScript中,我将使用fromCharCode()函数,但在XSLT中还没有找到类似的选项 我使用的是XSL2.0,但如果需要的话,也可以使用3.0来简化工作 我创建了一个简单的XML+XSL来显示我需要解决的问题。实际文件太大,无法在此处共享 XML输入文档示例:从XSLT中的字符代码创建文本,xslt,escaping,ascii,Xslt,Escaping,Ascii,我正在将文档从一种XML标准转换为另一种XML标准。其中一个要求是,编号列表使用字母而不是罗马编号。我可以从列表位置创建unicode,但似乎无法将它们插入到XML输出中 也许我只是没有看到明显的解决办法。在JavaScript中,我将使用fromCharCode()函数,但在XSLT中还没有找到类似的选项 我使用的是XSL2.0,但如果需要的话,也可以使用3.0来简化工作 我创建了一个简单的XML+XSL来显示我需要解决的问题。实际文件太大,无法在此处共享 XML输入文档示例: <doc
<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('&#',$number + 65,';')" disable-output-escaping="yes"/>
</label>
<xsl:copy-of select="."/>
</list-item>
</xsl:template>
</xsl:stylesheet>
我以前在其他生成的项上使用过禁用输出转义(例如,在XML输出中放入角括号),但似乎标准字符代码的处理方式不同。上述XSL的输出如下所示:
doc>
<list>
<list-item>
<label>B</label>
<p>Some text</p>
</list-item>
<list-item>
<label>C</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>