XSLT 1.0 中等效的字符串到代码点(字符串)
string-to-codepoints(string) equivalent in XSLT 1.0
我需要获取字符的ASCII值,如果满足特定条件,将ASCII码转换回字符。
所以我遇到了这些函数:
string-to-codepoints(string)
和
codepoints-to-string((int,int,...))
在 XSLT 2.0(或更确切地说 XPATH 2.0)中提供,但不幸的是我需要使用 XSLT 1.0 来完成此任务。
所以我的问题是
XSLT 1.0 中是否有这些函数的等效项?如果不能,我们可以设计吗?
这里的专家可以帮助我吗?
提前致谢
根据您的评论,您希望根据正则表达式执行字符串替换。如果您使用的是 Java 和 Xalan,那么我认为您可以使用例如java:replaceAll($inputString, $regExpPattern, $replacementString)
调用Java字符串方法replaceAll
,这里是一个简单的例子
<?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 replace
函数(replace('abc-123-def', '\w+', '?')
) 无需任何扩展。
我不确定这与您关于字符串到代码点和字符的 ASCII 代码的原始问题有什么关系。
可以用“?”替换代码点大于 255 的所有字符。使用没有扩展的纯 XSLT 1.0。
定义一个变量
<xsl:variable name="upto255">	

 !"#$%.../01234...ABC...abc...úûüýþÿ</xsl:variable>
其值是一个字符串,包含0..255范围内所有在XML.
中合法的字符
然后使用双重翻译技巧:
<xsl:variable name="above255" select="translate($input, $upto255, '')"/>
此变量是一个字符串,其中包含输入字符串中出现的所有非 Latin-1 字符。然后使用递归模板
<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>
创建正确数量的问号字符串:
<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>
然后进行替换:
<xsl:value-of select="translate($input, $above255, $qqq)"/>
但是当然,因为您在 Java 中,所以没有理由编写所有这些 XSLT 1.0 代码,如果您切换到 XSLT 2.0 处理器(如 Saxon),这些代码可以由一行代码替换。
我需要获取字符的ASCII值,如果满足特定条件,将ASCII码转换回字符。
所以我遇到了这些函数:
string-to-codepoints(string)
和
codepoints-to-string((int,int,...))
在 XSLT 2.0(或更确切地说 XPATH 2.0)中提供,但不幸的是我需要使用 XSLT 1.0 来完成此任务。
所以我的问题是
XSLT 1.0 中是否有这些函数的等效项?如果不能,我们可以设计吗? 这里的专家可以帮助我吗?
提前致谢
根据您的评论,您希望根据正则表达式执行字符串替换。如果您使用的是 Java 和 Xalan,那么我认为您可以使用例如java:replaceAll($inputString, $regExpPattern, $replacementString)
调用Java字符串方法replaceAll
,这里是一个简单的例子
<?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 replace
函数(replace('abc-123-def', '\w+', '?')
) 无需任何扩展。
我不确定这与您关于字符串到代码点和字符的 ASCII 代码的原始问题有什么关系。
可以用“?”替换代码点大于 255 的所有字符。使用没有扩展的纯 XSLT 1.0。
定义一个变量
<xsl:variable name="upto255">	

 !"#$%.../01234...ABC...abc...úûüýþÿ</xsl:variable>
其值是一个字符串,包含0..255范围内所有在XML.
中合法的字符然后使用双重翻译技巧:
<xsl:variable name="above255" select="translate($input, $upto255, '')"/>
此变量是一个字符串,其中包含输入字符串中出现的所有非 Latin-1 字符。然后使用递归模板
<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>
创建正确数量的问号字符串:
<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>
然后进行替换:
<xsl:value-of select="translate($input, $above255, $qqq)"/>
但是当然,因为您在 Java 中,所以没有理由编写所有这些 XSLT 1.0 代码,如果您切换到 XSLT 2.0 处理器(如 Saxon),这些代码可以由一行代码替换。