【问题标题】:string-to-codepoints(string) equivalent in XSLT 1.0XSLT 1.0 中的 string-to-codepoints(string) 等效项
【发布时间】:2016-08-05 09:06:30
【问题描述】:

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

所以我遇到了这些功能:

string-to-codepoints(string)

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

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

所以我的问题是

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

提前致谢

【问题讨论】:

  • 好吧,只有几个 ASCII 字符,所以如果您真的只对 XSLT 1.0 中的 ASCII 字符感兴趣,那么创建一个 XML 文件,将 127 个 ASCII 字符映射到它们的 ASCII 值并将其与子字符串一起使用. string-to-codepoints 但是适用于 Unicode 而不仅仅是 ASCII,因此您的映射文件需要相当大。
  • 您使用的是什么 XSLT 处理器,在什么环境中使用?大多数都有扩展机制,也许你可以利用它来发挥你的优势。
  • 你为什么不解释你到底想要完成什么,而不是你认为它需要如何完成 - 请参阅:xyproblem.info
  • @Martin and All 抱歉延迟回复.. 被困在一些工作中。我现在已经编辑了问题,你能提供一个解决方案吗
  • 好吧,用另一个字符替换一个字符,你可以使用例如translate('AAABBBCCC', 'B', 'D') 即使在没有任何扩展的 XPath 1.0 中

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


【解决方案1】:

可以用“?”替换所有代码点高于 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, '')"/>

此变量是一个字符串,其中包含输入字符串中存在的所有非拉丁语 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 处理器,这些代码可以被一行代码替换。

【讨论】:

  • 感谢您的宝贵时间。我已经编辑了我的问题,因为我不能再使用 java 扩展了。你能解释一下它是如何工作的吗?
  • 特别是$above255这部分你是怎么计算的
  • 我的答案的关键部分是不可见的,因为我未能将其标记为代码。很失望,您应该需要 6 周的时间才能做出回应。
  • 抱歉延迟回复.. 接受这个。您是 XSLT 天才。非常感谢。你救了我:)。
【解决方案2】:

根据您想要基于正则表达式执行字符串替换的 cmets。如果您使用的是 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 码的原始问题有什么关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2022-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多