【发布时间】:2014-05-24 20:35:45
【问题描述】:
在我看来,JDK 6(和 7)附带的 Xalan 版本不处理输入文件中的 cmets,如 <xsl:template match="comment()" ...>... 指定的那样
给定以下输入文件,dangling.xml
<?xml version="1.0" ?>
<dangling xmlns:dt="urn:uuid:e2973380-8daf-11e3-a5d8-0002a5d5c51b">
<!-- This is a comment. -->
<foobar x="y">A bar where I drink foo beer,
after debugging XSLT in hell all day.</foobar>
</dangling>
和样式表 identity_sans_dt.xsl
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dt="urn:uuid:e2973380-8daf-11e3-a5d8-0002a5d5c51b">
<xsl:output method="xml"
encoding="UTF-8"
indent="yes"
omit-xml-declaration="yes"
/>
<xsl:template match="/ | attribute::* | comment()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我使用 libxml 的 xsltproc 得到以下输出
<dangling>
<!-- This is a comment. -->
<foobar x="y">A bar where I drink foo beer,
after debugging XSLT in hell all day.</foobar>
</dangling>
但是,当我通过使用 SAX TransformerHandler 应用相同样式表的 Java 程序运行相同的事情时,我得到了这个。
<dangling>
<foobar x="y">A bar where I drink foo beer,
after debugging XSLT in hell all day.</foobar>
</dangling>
我是否做错了什么导致技术规范委婉地称为“不可预测的结果”?还是似乎有一个 Xalan 错误导致 Java 版本中注释的遗漏?
虽然与 comment() 处理的问题没有直接关系,但这里是本练习的背景。 dangling.xml 是一些先前处理的结果,这些处理已经剥离了 dt 命名空间中的所有元素及其子元素。出于某种原因,dt 命名空间声明被留下了。此外,xml 声明引起了一些问题。 (这是因为一些下游代码将其作为字符串进行操作,然后将其放入另一个 XML 文本字符串的中间。不要告诉我这有多可怕;我知道。不要告诉那些负责说代码;我已经这样做了。)所以我花了很多时间试图摆脱这两个烦人的工件,但保留其他所有东西。
不,dangling.xml 不是真正的文件,只是调试的代理。 :-)
因此,如果有一种完全更好的方法可以回避整个问题,我也有兴趣了解这一点。
提前谢谢你。
【问题讨论】: