3

我有几个 XML 文件,其中包含代码点值介于 57600 和 58607 之间的 unicode 字符。目前这些在我的内容中显示为方块,我想将它们转换为元素。

所以我想要实现的是:

<!-- 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 -->

我已经用标记器愚弄了一点,但是由于您需要参考 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>
4

2 回答 2

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().

于 2012-05-29T12:43:23.663 回答
3

这听起来像是一份工作,analyze-string例如

<xsl:template match="text()">
  <xsl:analyze-string select="." regex="[&#57600;-&#58607;]">
    <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>

未经测试。

于 2012-05-29T12:45:01.527 回答