如何在另一个XML中使用包装在CDATA中的XML进行XSL转换?

问题描述:

XML文档包含另一个包含在CDATA中的XML元素。如何在另一个XML中使用包装在CDATA中的XML进行XSL转换?

如何将包装的XML用于XSL和XSL-FO转换(版本1)?

对于标准的XSLT 1.0或2.0,在单个转换中这是不可能的。

它可以使用Saxon 9专业版或企业版来完成。这些产品具有saxon:parse()扩展功能。或者使用最近版本的Saxon PE/EE也支持的功能,即XPath 3.0parse-xml()功能。


正如@grtjn指出的那样,可以通过两遍处理来完成。样式表1将CDATA包装的文本转换为可解析的XML(使用<xsl:value-of select="whatever" disable-output-escaping="yes"/>)。样式表2然后处理由样式表1产生的序列化结果。

+0

它应该可能在第二遍,如[@grtjn](http://stackoverflow.com/a/9108085/413020)已经指出。不应该吗? – Alberto 2012-06-15 16:46:25

+0

请记住,它可以使两个过程步骤如何连接在一起。我已经看到了通过SAX事件在Java中连接两个XSLT步骤的情况,但事实证明,这个无用的操作被推迟到序列化之后,所以后续的XSLT无法访问未转义的XML .. – grtjn 2012-06-19 05:49:05

+0

@grtjn:是的,结果树必须被序列化为'disable-output-escaping =“yes”'才能工作。 – mzjn 2012-06-19 15:00:31

如果您愿意采取多个转换步骤,那么这是可能的。使用disable-output-escaping输出相关部分以将转义的XML转换为有效的XML。在后续步骤中处理它。

它确实需要转义的XML格式良好。有些解析器需要将中间结果序列化(先到磁盘或其他),以确保转义的XML在进入后续转换之前正确转义。