使用 XSLT 转换 xml 中的特殊字符

Posted

技术标签:

【中文标题】使用 XSLT 转换 xml 中的特殊字符【英文标题】:Converting special characters in xml using XSLT 【发布时间】:2017-07-21 16:26:18 【问题描述】:

我正在尝试使用 xslt 将 xml 中的特殊字符转换为它们的编码形式。

例子:

& to & 
" to " 
< to &lt; 
> to &gt;

等等。 下面给出了我使用的代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" encoding="UTF-8"/>

<xsl:template match="/">
    <xsl:apply-templates select="//search-results/items" />
</xsl:template>

<xsl:template match="items">
    <textarea>
        <xsl:apply-templates select="file-item" />
    </textarea>
</xsl:template>


<xsl:template match="file-item">
    <xsl:apply-templates select="." mode="details"/>    
</xsl:template>


<xsl:template match="*" mode="details">
    <file-item>
        <id><xsl:value-of select = "@id"/></id>
        <xsl:copy-of select = "name"/>
        <xsl:copy-of select = "creation-date" />
        <xsl:copy-of select = "modification-date"/>
        <xsl:copy-of select = "file-info"/>
        <xsl:copy-of select = "creator"/>
        <xsl:copy-of select = "last-modifier"/>     
      </file-item>        
</xsl:template>
</xsl:stylesheet>

XML 结构是

<id>5060554</id>
<name>This is a File && and it is a "Test File" </name>
<creation-date timestamp="1487516375360">19.02.2017 14:59</creation-date>
<modification-date timestamp="1488128705695">26.02.2017 17:05</modification-date>
<file-info>
<name>Background-Wallpaper & Nature.jpg</name>
<creator user-id="2196">
<last-modifier user-id="2120">

输出也应该包含 xml 节点,这就是为什么在 textarea 中使用 xsl:copy of 而不是 xsl:value-of。因为 xsl:value-of select="name" 只会输出 This is a File && 并且它是“Test File” 而 xsl:copy-of 会产生 This is a File &&它是一个“测试文件”

我正在使用 XSLT 版本 1.o

正在寻找的期望输出是 This is a File &amp;amp; &amp;amp; and it is a &amp;quot;Test File&amp;quot;

【问题讨论】:

要使用 XSLT 处理 XML,您需要格式良好的输入数据。实体名称必须紧跟实体引用中的“&”。这意味着 & 字符需要在输入中转义或标记为 CDATA(同样适用于 嗨 Lesiak,数据直接来自数据库,我们正在使用 XSLT 将数据转换为 xml,然后转换为 html(网站的 UI 视图)。所以,我无法控制修改 xml 那么您需要以另一种方式进行操作,而不是 xslt,因为如上所述 xslt 处理格式正确的 xml,而您的数据库输出 不是 如果您在 SOA 环境中工作,您也许可以在转换之前使用 java 嵌入,在其中您将特殊字符转换为它们各自的 xml 对应物。在这种情况下,特殊字符不再需要 xslt 中的转换。 【参考方案1】:

你说输入的 XML 包含

<name>This is a File && and it is a "Test File" </name>

这是一个矛盾。如果它包含那个字符串,那么它就不是 XML。 XML 中的 & 符号总是被转义的。如果输入不是 XML,那么您就不能使用 XSLT 来处理它。

您说“我们正在使用 XSLT 将数据转换为 xml,然后再转换为 html(网站的 UI 视图)”。您似乎错误地将数据转换为 XML,您需要修复它。

【讨论】:

为了确保正确理解 Michael 所说的:使用 XSLT 的方式(以及 XSLT 的典型使用方式)要求输入是 XML。您不能使用 XSLT 来“修复”伪 XML 并将其转换为真正的 XML。问题必须首先在生成 XML 的地方解决。

以上是关于使用 XSLT 转换 xml 中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

当属性名称包含特殊字符时,使用 xslt 转换 xml 结果后,输出未以 HTML 格式显示

使用应用模板在 XSLT 输出中保留   和其他特殊字符

XML 属性值中 转换 特殊字符

替换 PL/SQL 中的特殊 XML 字符

在 XSLT 中的字符串中转义“&”

如何处理JSON中的特殊字符