使用XSL和字符串到代码点操作字符实体

时间:2012-07-02 22:01:58

标签: xslt character-encoding

我对XSL比较陌生。我需要以特定方式处理特殊字符(BasicLatin代码块之外的任何字符)。我知道实体代码和文字字符基本相同,但我需要在文本编辑器中工作,这种方式看不到它(这是我无法控制的)。因此,保留字面字符不是一种选择。我想在我的XSL中处理这个问题,而不是通过Perl或其他一些机制,如果可能的话。这就是我所拥有的:

<p>This is a story&#x2014;a long story.</p>

这是我想要的结果:

<p>This is a story<0x2014>a long story.</p>

我一直试图通过正则表达式来做到这一点,例如:

<xsl:value-of select="replace(., '(\P{IsBasicLatin})', 'concat('&lt;0x', string-to-codepoints($1), '&gt;'))"/>

但是我得到一个错误,即在数字文字后需要分隔符。我无法找到任何我理解的错误的文档。它与我尝试使用函数作为替换的一部分有关吗?在XSL中是否允许这样的事情?如果没有,欢迎任何建议。我确实查看了这里提供的答案:convert character if codepoint within given range,它似乎相关但对我不起作用(第一个消除了我的特殊字符,第二个给了我非常奇怪的输出。)

任何帮助将不胜感激。我假设我缺少关于函数或代码点的东西,但我自己也遇到了一些问题。谢谢!

2 个答案:

答案 0 :(得分:1)

您尝试生成的输出不是格式良好的XML,因此XSLT不愿意让您生成它。您确定要生成没有XML解析器可以接受的输出吗?

代码中的实际问题是对concat调用的单引号。您编写的表达式是字符串文字'concat('后跟运算符&lt;,后跟整数文字零,后跟名称x,这不是有效的XPath语法。

答案 1 :(得分:0)

  

我不确定回答我自己的问题是否是犹太人,但我终于找到了一个部分解决方案,类似于我给出的链接的第一个答案。

<xsl:analyze-string select="." regex="\P{{IsBasicLatin}}"> 
  <xsl:matching-substring> 
    <xsl:text>&lt;0x</xsl:text>

    <xsl:value-of select="string-to-codepoints(regex-group(0))"/>

    <xsl:text>&gt;</xsl:text>
  </xsl:matching-substring> 
  <xsl:non-matching-substring> 

    <xsl:copy-of select="."/> 
  </xsl:non-matching-substring> 
</xsl:analyze-string>