XSLT 1.0中的字符串到代码点(字符串)等效

时间:2016-08-05 09:06:30

标签: xslt xslt-1.0 xslt-2.0 xpath-2.0

如果符合某些条件,我需要获取字符的ASCII值并将ASCII码转换回字符。

所以我遇到了这些功能:

string-to-codepoints(string)

codepoints-to-string((int,int,...))

在XSLT 2.0(或者更确切地说是XPATH 2.0)中提供但不幸的是我需要使用XSLT 1.0来完成这项任务。

所以我的问题是

XSLT 1.0中是否有这些功能的等价物?如果不是我们可以设计吗? 这里的专家可以帮助我吗?

提前致谢

2 个答案:

答案 0 :(得分:3)

可以用“?”替换255以上代码点的所有字符。使用没有扩展名的纯XSLT 1.0。

定义变量

<xsl:variable name="upto255">&#x9;&#xa;&#xd; !"#$%.../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代码,如果你切换到像Saxon这样的XSLT 2.0处理器,它可以被一行代码替换。

答案 1 :(得分:0)

根据您的评论,您希望根据正则表达式执行字符串替换。如果您使用的是Java和Xalan,那么我认为您可以使用例如java:replaceAll($inputString, $regExpPattern, $replacementString)调用Java String方法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代码的原始问题有什么关系。