0

我对 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,这似乎相关但对我不起作用(第一个消除了我的特殊字符,第二个给了我非常奇怪的输出。)

任何帮助,将不胜感激。我想我错过了一些关于函数或代码点的东西,但我自己已经碰到了一些障碍。谢谢!

4

2 回答 2

1

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

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

于 2012-07-03T07:08:13.557 回答
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>
于 2014-07-15T01:23:07.060 回答