我有几个包含unicode字符的XML文件,其代码点值介于57600和58607之间。目前这些文件在我的内容中显示为方块,我想将它们转换为元素。
所以我想要实现的是:
<!-- current input -->
<p> Follow the on-screen instructions.</p>
<!-- desired output-->
<p><unichar value="58208"/> Follow the on-screen instructions.</p>
<!-- Where 58208 is the actual codepoint of the unicode character in question -->
我已经使用tokenizer愚弄了一下,但是因为你需要引用split,所以结果很复杂。
有关如何解决这个问题的建议吗?我一直在尝试下面的一些东西,但是被击中了(不介意语法,我知道它没有任何意义)
<xsl:template match="text()">
-> for every character in my string
-> if string-to-codepoints(current character) greater then 57600 return <unichar value="codepoint value"/>
else return character
</xsl:template>
答案 0 :(得分:3)
此转化:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/*">
<p>
<xsl:for-each select="string-to-codepoints(.)">
<xsl:choose>
<xsl:when test=". > 57600">
<unichar value="{.}"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="codepoints-to-string(.)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</p>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<p> Follow the on-screen instructions.</p>
生成想要的正确结果:
<p><unichar value="58498"/> Follow the on-screen instructions.</p>
解释:正确使用标准XPath 2.0函数 string-to-codepoints()
和 codepoints-to-string()
。
答案 1 :(得分:3)
这听起来像是analyze-string
的工作,例如
<xsl:template match="text()">
<xsl:analyze-string select="." regex="[-]">
<xsl:matching-substring>
<unichar value="{string-to-codepoints(.)}"/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
未测试。