【问题标题】:Cleaning CDATA in xml through xslt通过 xslt 清理 xml 中的 CDATA
【发布时间】:2011-07-09 02:08:54
【问题描述】:

我正在尝试将来自 Wordpress 的 RSS 2 转换为 XHTML 1.0 Strict(使用 cronjob 和 xsltproc);但是,Wordpress 在summary 元素末尾的CDATA 中插入了一个imgimg 有一个 border 属性,该属性在 XHTML 1.0 Strict 中无效。因为它是 CDATA,所以我认为这意味着我无法将它与我的 XSLT 匹配。我可以肯定地说img 始终是CDATA 结束之前的最后一件事。我宁愿剥离 border attr 并保留图像,但我宁愿完全摆脱元素也不愿使用无效标记。

是否可以使用 XSLT 在 CDATA 内部进行匹配,或者使用字符串表达式?如果是这样,这是正确的方法,还是有更好的解决方案?

【问题讨论】:

  • 首先,没有元素,也没有属性,因为 CDATA 只是未解析的文本。 不要将可解析的数据视为未解析的数据。其次,每个提要阅读器都支持 Atom,可以正确处理混合内容。
  • 类似问题前段时间讨论过:stackoverflow.com/questions/5100482/…

标签: wordpress xslt rss xhtml-1.0-strict rss2


【解决方案1】:

记住 CDATA 的含义:“字符数据”。在 CDATA 中放一些东西意味着:这可能看起来像标记,但我不希望你把它当作标记。因此,如果 CDATA 中的那个东西看起来像一个 img 元素,那么 CDATA 会告诉你不要被愚弄——它根本不是一个元素。话虽如此,您当然可以像处理任何其他字符串一样处理文本,包括将其传递给 XML 解析器以转换为节点树。

【讨论】:

  • 我想知道saxon:parse() 可以即时处理CDATA 部分还是应该通过其他方式对其进行预处理?
  • 是的。 saxon:parse() 的发明是为了帮助人们从这个漏洞中挖掘出来——使用 CDATA 来“隐藏”原本不应该隐藏的标记。
【解决方案2】:

CDATA 只是一个文本节点,您可以将其与text() 模板匹配。然后可以使用字符串函数从文本中删除border attr。

【讨论】:

    猜你喜欢
    • 2016-06-05
    • 2016-02-21
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多