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



我正在使用XSLT 1.0和XML。我是这些主题的新手,但我一直在阅读并尝试如何将XSLT应用于XML。现在,我给出了一个项目,需要从XML元素中过滤掉无效字段。java Transformer类用于在XML上应用XSLT。java代码类似于"编写XSLT转换"一节中的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转义单引号和双引号以及其他无效字符时,正确的方法是什么?我也试过嵌套

翻译
创建"single"后的XSLT函数如下所示和";double"变量。
<xsl:value-of select="translate(translate(/Author/Name/FirstName,$single,''),$double,'')" />

我仍然不确定使用我当前的任何实现的利弊,甚至不确定它是否是执行这些任务的正确方法。

XPath 1.0规范规定:

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

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

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

或单引号(撇号)字符:

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

但不能两者都用

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