使用 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 中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章