【问题标题】:lxml XSLT removes CDATA while processing XMLlxml XSLT 在处理 XML 时删除 CDATA
【发布时间】:2013-06-24 10:51:16
【问题描述】:

使用 lxml 处理 CDATA 需要使用适当的声明制作解析器,但是 XSLT 呢? 例如:

from lxml import etree

parser = etree.XMLParser(strip_cdata=False)
tree = etree.parse('sample_with_cdata.xml', parser)
transform = etree.XSLT(etree.parse('dupe.xsl'))
xml_out = transform(tree)
xml_out.write('processed.xml')

如果我通过 lxml XSLT 处理器处理带有 CDATA 的 xml 文件,所有 CDATA 都会被剥离。如何让 XSLT 处理器保持 CDATA 不变?

PS。仅供参考,将相同的解析器添加到 etree.XSLT 不会改变结果

【问题讨论】:

    标签: python xml xslt lxml


    【解决方案1】:

    就 XSLT 而言,XML 中的 CDATA 部分只是噪音。 XSLT 将<![CDATA["]]> 视为与" 相同,它与" 相同;它们是文档作者编写相同内容的不同方式。

    如果您在输入中使用 CDATA 部分来传达信息,也就是说,如果 <![CDATA[xxx]]> 的含义与 xxx 不同,那么您需要更改您的 XML 设计。

    【讨论】:

    • 我的 XML 是 RSS,描述元素包含用于基本格式化目的的 CDATA。
    【解决方案2】:

    这似乎与lxml无关。是我缺乏知识...

    XSLT 中的 CDATA 应在输出声明中使用“cdata-section-elements”属性处理。例如,如果 XML 文件中的描述元素包含 CDATA:

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

    【讨论】:

      猜你喜欢
      • 2016-06-05
      • 2011-07-09
      • 2014-10-05
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      相关资源
      最近更新 更多