string-to-codepoints(string) equivalent in XSLT 1.0
如果满足某些条件,我需要获取字符的 ASCII 值并将 ASCII 码转换回字符。
所以我遇到了这些函数:
和
在 XSLT 2.0 中提供(或者更确切地说是 XPATH 2.0)但不幸的是我需要使用 XSLT 1.0 来完成这项任务。
所以我的问题是
在 XSLT 1.0 中是否有与这些功能等效的功能?如果不能,我们可以设计吗?
这里的专家可以帮助我吗?
提前致谢
可以用"?"替换所有代码点高于 255 的字符使用没有扩展的纯 XSLT 1.0。
定义一个变量
1 | <xsl:variable name="upto255"> !"#$%.../01234...ABC...abc...?o??????????</xsl:variable> |
其值是一个字符串,包含 0..255 范围内的所有 XML 中合法的字符。
然后使用双重翻译技巧:
1 | <xsl:variable name="above255" select="translate($input, $upto255, '')"/> |
此变量是一个字符串,其中包含输入字符串中存在的所有非拉丁语 1 字符。然后使用递归模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <xsl:template name="pad"> <xsl:param name="char"/> <xsl:param name="count"/> <xsl:choose> <xsl:when test="$count=0"/> <xsl:otherwise> <xsl:value-of select="$char"/> <xsl:call-template name="pad"> <xsl:with-param name="char" select="$char"/> <xsl:with-param name="count" select="$count - 1"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> |
创建一个包含正确数量的问号的字符串:
1 2 3 4 5 6 | <xsl:variable name="qqq"> <xsl:call-template name="pad"> <xsl:with-param name="char" select="'?'"/> <xsl:with-param name="count" select="string-length($above255)"/> </xsl:call-template> </xsl:variable> |
然后进行替换:
1 | <xsl:value-of select="translate($input, $above255, $qqq)"/> |
当然,既然您使用的是 Java,没有任何借口可以编写所有这些 XSLT 1.0 代码,如果您切换到诸如 Saxon 之类的 XSLT 2.0 处理器,这些代码可以被一行代码替换。
根据您的评论,您希望基于正则表达式执行字符串替换。如果您使用的是 Java 和 Xalan,那么我认为您可以使用例如
1 2 3 4 5 6 7 8 9 10 11 12 | <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xalan/java" version="1.0" exclude-result-prefixes="java"> <xsl:template match="/"> <xsl:value-of select="java:replaceAll('abc-123-def','\\w+', '?')"/> </xsl:template> </xsl:stylesheet> |
使用 Xalan 为我输出
另一方面,如果您使用的是 Java,那么您应该考虑迁移到 Saxon 9 和 XSLT 2.0,因为这样您就可以使用 XPath 2.0
我不确定这与您关于字符串到代码点和字符的 ASCII 码的原始问题有什么关系。