java - Xalan with Java 6 会跳过注释吗?

标签 java xml xslt xalan

在我看来,JDK 6(和 7)附带的 Xalan 版本不处理输入文件中的注释,如 <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 namespace 声明被遗留下来。此外,xml 声明引起了一些问题。 (这是因为某些下游代码将其作为字符串进行操作,然后将其放入另一个 XML 文本字符串的中间。别费心告诉我这有多可怕;我知道。别费心告诉那些负责的人说代码;我已经。)所以我花了过多的时间试图摆脱这两个烦人的工件,但保留其他所有东西。

不,dangling.xml 不是真正的文件,只是用于调试的代理。 :-)

因此,如果有一种完全更好的方法可以回避整个问题,我也有兴趣了解它。

提前谢谢你。

最佳答案

可能是你运行的不正确。在 SAX 中,XMLReader 将大多数解析事件通知给注册的 ContentHandler,但不通知发送给注册的 LexicalHandler 的注释。 JAXP TransformerHandler 实现了 ContentHandler 和 LexicalHandler 接口(interface),但只有在它作为 ContentHandler 和 LexicalHandler 注册到 XMLReader 时才会收到评论通知。

关于java - Xalan with Java 6 会跳过注释吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22999870/

相关文章:

xslt - 在 XSLT 中,如何在访问另一个 XPath 时访问一个 XPath?

java - 如何将 Redis 数据库值写入 excel 表?

java - Google guava 单例 Eventbus 多次触发

java - 如何从 java 代码调用 XSL 模板?

html - 通用XSLT,可将任何XML转换为基于节点的许多HTML页面

java - 将大型 SQLite 表转换为 XML

html - 如何使用 XSLT 构建字母 Accordion ?

java - JAVA数组索引越界异常

java - 使用java获取图像的颜色

android - 创建自定义弹出对话框菜单