【问题标题】:Is it normal that (some) HTML entities are breaking the XSL engine?(某些)HTML 实体破坏 XSL 引擎是否正常?
【发布时间】:2011-10-11 02:12:15
【问题描述】:

我有一个使用 PHP DOMDocument 动态生成的 XML 文档。我将此 XML 与 XSL 文件一起使用。在我从数据库条目中获得日元货币符号 (¥) 之前,它运行良好。该符号被转义为¥ HTML 实体。该实体正在破坏 XSL/XML 引擎:

警告:DOMDocument::load() [domdocument.load]: Entity 'yen' not 在 %file.xml% 中定义,行:%1% in %file.php% on line %2%

¥ 实体不存在时,一切正常。

有什么我没有做/包含/配置来得到这个错误吗?

【问题讨论】:

  • 您的问题标题的答案是肯定的,但根据您的 cmets,这并不是您真正想要找出的。如果您发布一些输出日元实体的 PHP 代码,我们可能更能帮助您。比如,你用什么方法来序列化?

标签: php xml xslt domdocument html-entities


【解决方案1】:

XML 仅识别几个字符实体:<>"&'。除非您自己为实体添加定义,否则其他任何内容都将是解析错误:<!ENTITY yen "&#x00a5">

【讨论】:

    【解决方案2】:

    使用¥,您的 XML 将变成格式不正确的 XML,因为 XML 没有预定义的 ¥ 实体。 ¥ 的有效转义版本是 ¥

    【讨论】:

    • 是的,我知道,但为什么 DOMDocument 会自动转义?
    【解决方案3】:

    在使用 XML 时,默认定义的唯一实体是 &<>。任何其他实体都需要在 DTD 中定义。

    XSL 没有在其文档类型中定义任何其他实体。即使您要转换为 (x)HTML,也没有定义其他实体,因为您的主要文档类型是用于 XSL。

    可以添加一大堆声明来在 DTD 中定义它们,但这意味着使用自定义 DTD,这并不理想,而且需要大量维护工作。

    坦率地说,最简单的解决方案就是对所有内容都使用数字实体代码。这很痛苦,但它适用于任何 XML 方言,而不需要对 DTD 进行任何修改。

    【讨论】:

    • 我的问题是似乎 DOMDocument::createTextNode 方法正在自动转义 ¥ 到 ¥从而打破后来的过程......
    • @Alex:您可能想编辑您的问题以澄清您在问为什么 DOMDocument 输出这个实体......大多数人认为您在问为什么这个实体在 XML 中是不允许的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多