使用 XSLT 翻译功能或更好的方法删除单引号和双引号

Posted

技术标签:

【中文标题】使用 XSLT 翻译功能或更好的方法删除单引号和双引号【英文标题】:Removing both single and double quotes using XSLT translate function or better approach 【发布时间】:2021-12-04 04:16:46 【问题描述】:

我正在使用 XSLT 1.0 和 XML。我是这些主题的新手,但我一直在阅读并尝试如何将 XSLT 应用于 XML。 现在,我给出了一个需要从 XML 元素中过滤掉无效字段的项目。 java Transformer 类用于在 XML 上应用 XSLT。 java代码类似于"Writing an XSLT Transform"部分下的oracle教程页面。我添加了以下 xml 和 xsl 并运行教程页面中描述的代码。我的目标是提取单引号和双引号以及以下字符#60;•^#x6;

XML 文件

<?xml version="1.0" encoding="UTF-8"?>
<Author>
    <Name>
        <FirstName>Ch#60;•^#x6;'""ris</FirstName>
        <LastName>Banville</LastName>
    </Name>
</Author>

XSL 文件

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                 <xsl:variable name="invalid">#60;•^#x6;"'</xsl:variable>
                 <div>
                 <xsl:value-of select="translate(/Author/Name/FirstName,$invalid,'')" />
                 </div>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

最终输出是

  <body>
     <div>Chris</div>
   </body>

我的问题是,在使用 XSLT 1.0 来同时转义单引号和双引号以及其他无效字符时,正确的方法是什么?我也试过嵌套

翻译

创建“单”和“双”变量后的XSLT函数如下图所示。

<xsl:value-of select="translate(translate(/Author/Name/FirstName,$single,''),$double,'')" />

我仍然不确定使用我当前的任何实现的利弊,或者即使它是执行此类任务的正确方法。

【问题讨论】:

【参考方案1】:

XPath 1.0 specification 声明:

在表达式中,文字字符串由单引号或双引号分隔,也用于分隔 XML 属性。为了避免表达式中的引号被 XML 处理器解释为终止属性值,可以输入引号作为字符引用(&amp;quot;&amp;apos;)。或者,如果 XML 属性用双引号分隔,则表达式可以使用单引号,反之亦然。

这意味着在仅使用文字字符串的单个表达式中,您可以通过以下方式删除双引号字符:

<xsl:value-of select="translate(input, '&quot;'')"/>

或单引号(撇号)字符:

<xsl:value-of select='translate(input, "&apos;", "")'/>

但不是两者兼而有之。

将包含所有不需要的字符的变量定义为文字文本(就像您所做的那样)可能是解决此限制的最佳方法。

【讨论】:

感谢您提供有关规范内容的信息。除了使用翻译功能或不定义变量之外,我还有其他选择吗? 我想你确实有 other 选项(也许调用递归命名模板),但我认为你没有 更好 选项。你为什么这么关心这个?这是一种非常标准的技术 - 参见例如 ***.com/a/53345648/3016153 我很担心,因为我对这个话题没有先验知识,我只是想看看其他人的做法。我会接受我所拥有的

以上是关于使用 XSLT 翻译功能或更好的方法删除单引号和双引号的主要内容,如果未能解决你的问题,请参考以下文章

向MySQL数据库插入单引号或双引号

单引号和双引号有啥区别?

如何在 YAML 中声明带有单引号和双引号的字符串?

python单引号和双引号的区别

我应该在 .vimrc 文件中使用单引号还是双引号?

python脚本入参的单、双引号