Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java6的Xalan是否跳过注释?_Java_Xml_Xslt_Xalan - Fatal编程技术网

使用Java6的Xalan是否跳过注释?

使用Java6的Xalan是否跳过注释?,java,xml,xslt,xalan,Java,Xml,Xslt,Xalan,在我看来,JDK 6(和7)附带的Xalan版本不处理输入文件中的注释,如… 给定以下输入文件,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 b

在我看来,JDK 6(和7)附带的Xalan版本不处理输入文件中的注释,如

给定以下输入文件,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>

我喝富啤酒的酒吧,
在地狱里调试XSLT一整天之后。
以及样式表标识_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>

我喝富啤酒的酒吧,
在地狱里调试XSLT一整天之后。
然而,当我通过使用SAX TransformerHandler应用相同样式表的Java程序运行相同的东西时,我得到了这个结果

<dangling>

   <foobar x="y">A bar where I drink foo beer,
           after debugging XSLT in hell all day.</foobar>
</dangling>

我喝富啤酒的酒吧,
在地狱里调试XSLT一整天之后。
我是否做了一些错误的事情,导致了技术规范委婉地称之为“不可预测的结果”的结果?或者是否有Xalan bug对Java版本中的注释遗漏负责

虽然与comment()处理问题没有直接关系,但下面是本练习的背景。xml是先前某些处理的结果,这些处理剥离了dt命名空间中的所有元素及其子元素。出于某种原因,dt名称空间声明被抛在了后面。此外,xml声明还引发了一些问题。(这是因为一些下游代码将其作为字符串进行操作,然后将其扑通一声放到另一个XML文本字符串的中间。不要麻烦告诉我这有多可怕;我知道。不要麻烦告诉负责这些代码的人;我已经说过了。)所以我花了大量的时间试图摆脱这两个恼人的工件,但保留了所有其他的东西

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

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


提前感谢。

上次我检查时,Sun/Oracle JRE附带的Apache Xalan和Xerces版本已经过时多年,并且有许多已知的bug和限制。除非Oracle在Java 7或Java 8中纠正了这一点——即使他们已经纠正了——否则我强烈建议您直接从Apache下载当前的副本,并改用它们


(IBM JRE——唉,除了作为IBM产品的一部分之外,它不可用——更密切地跟踪Apache,部分原因是IBM团队是Xalan和Xerces的原始捐赠者并一直参与支持它们。最近的IBM JRE用IBM的下一代XSLT处理器XL-TXE取代了Xalan。IBM WebSphere提供了XL-TXE作为其XML功能包的一部分;该版本增加了对XQuery 1.0、XSLT 2.0和XPath 2.0的支持。)

可能是您运行不正确。在SAX中,XMLReader会将大多数解析事件通知注册的ContentHandler,但不会通知注释,这些事件会发送到注册的LexicalHandler。JAXP TransformerHandler实现ContentHandler和LexicalHandler接口,但只有当注释被通知时,才会通知它以ContentHandler和LexicalHandler的身份向XMLReader注册。

我将为任何遇到这个恼人问题的人提供答案

但首先,我要再次感谢迈克尔·凯为我指明了最终解决方案的方向

问题是首先需要在处理输入的原始XMLReader上设置词法处理程序。我错误地将问题解释为必须有词法处理程序来收集注释以编写最终结果。因此,我误解了给出的建议

在做了更多的研究之后,我发现了后续问题的答案,即“如何在XMLReader上设置词法分析器?”在我看来,这是非常隐蔽的。在SAXParser和XMLReader对象上都有一个setProperty方法,而不是像SAXSresult上那样简单的setLexicalHandler方法

 void XMLReader.setProperty(String name, Object value);
 void SAXParser.setProperty(String name, Object value);
“标准”属性名是在中指定的URL。其他实现可能会添加它们自己特有的属性,只要它们使用的URL与标准不冲突。这似乎是一种很好的扩展机制,但我不理解为什么它们将其用于API的标准部分的对象;或者相反,为什么它们没有指定以同样的方式对所有内容(包括ContentHander)进行处理(换句话说,要始终如一地进行处理)

因此,我们必须使用字符串
”,而不是简单的setLexicalHandler方法,这在我看来根本不是一个简单的方法http://xml.org/sax/properties/lexical-handler“
指示正在设置词法处理程序,并将该处理程序作为第二个(非类型安全对象)参数提供

以下是我课程“前端”的相关部分:

        saxReader = saxParserFactory.newSAXParser().getXMLReader();
        saxReader.setContentHandler(transformsHandler);
        saxReader.setProperty("http://xml.org/sax/properties/lexical-handler", transforms[0]);

如果没有包含setProperty调用,您的转换器将永远看不到输入中的注释,因此,与我的情况一样,XSLT是否处理它们也无关紧要。这是Michael最初的简明解释。

还有Saxon,它至少实现了XSLT 2.0。Apache Xalan本身一直停留在1.0,一个自2007年以来,d甚至都没有重新发布过。没错。IBM团队对Xalan做出了巨大贡献的问题在于,当他们不得不将注意力从它转移开时,没有很多其他人准备好填补空白。谢谢你,Michael。XMLReader上没有setLexicalHandler方法;请参阅。所讨论的代码实际上是我们es TransformerHandler,它将其设置为TransformerHandler上的ContentHandler。那么如何指定这也是LexicalHandler呢?更新:响应Mi