使用 XSLT 转换 xml 中的特殊字符
Posted
技术标签:
【中文标题】使用 XSLT 转换 xml 中的特殊字符【英文标题】:Converting special characters in xml using XSLT 【发布时间】:2017-07-21 16:26:18 【问题描述】:我正在尝试使用 xslt 将 xml 中的特殊字符转换为它们的编码形式。
例子:
& to &
" to "
< to <
> to >
等等。 下面给出了我使用的代码
<?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; and it is a &quot;Test File&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 中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章