我对XSL比较陌生。我需要以特定方式处理特殊字符(BasicLatin代码块之外的任何字符)。我知道实体代码和文字字符基本相同,但我需要在文本编辑器中工作,这种方式看不到它(这是我无法控制的)。因此,保留字面字符不是一种选择。我想在我的XSL中处理这个问题,而不是通过Perl或其他一些机制,如果可能的话。这就是我所拥有的:
<p>This is a story—a long story.</p>
这是我想要的结果:
<p>This is a story<0x2014>a long story.</p>
我一直试图通过正则表达式来做到这一点,例如:
<xsl:value-of select="replace(., '(\P{IsBasicLatin})', 'concat('<0x', string-to-codepoints($1), '>'))"/>
但是我得到一个错误,即在数字文字后需要分隔符。我无法找到任何我理解的错误的文档。它与我尝试使用函数作为替换的一部分有关吗?在XSL中是否允许这样的事情?如果没有,欢迎任何建议。我确实查看了这里提供的答案:convert character if codepoint within given range,它似乎相关但对我不起作用(第一个消除了我的特殊字符,第二个给了我非常奇怪的输出。)
任何帮助将不胜感激。我假设我缺少关于函数或代码点的东西,但我自己也遇到了一些问题。谢谢!
答案 0 :(得分:1)
您尝试生成的输出不是格式良好的XML,因此XSLT不愿意让您生成它。您确定要生成没有XML解析器可以接受的输出吗?
代码中的实际问题是对concat调用的单引号。您编写的表达式是字符串文字'concat('后跟运算符&lt;,后跟整数文字零,后跟名称x,这不是有效的XPath语法。
答案 1 :(得分:0)
我不确定回答我自己的问题是否是犹太人,但我终于找到了一个部分解决方案,类似于我给出的链接的第一个答案。
<xsl:analyze-string select="." regex="\P{{IsBasicLatin}}">
<xsl:matching-substring>
<xsl:text><0x</xsl:text>
<xsl:value-of select="string-to-codepoints(regex-group(0))"/>
<xsl:text>></xsl:text>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:copy-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>