0

我将tagoup用作 (SAX)XMLREader并将命名空间功能设置为false. 此解析器用于提供TransformerSAX 源。完整代码:

    final TransformerFactory factory = TransformerFactory.newInstance();
    final Transformer t = factory.newTransformer(new StreamSource(
        getClass().getResourceAsStream("/identity.xsl")));

    final XMLReader p = new Parser(); // the tagsoup parser
    p.setFeature("http://xml.org/sax/features/namespaces", false);

    // getHtml() returns HTML as InputStream
    final Source source = new SAXSource(p, new InputSource(getHtml())); 

    t.transform(source, new StreamResult(System.out));

这会导致类似:

< xmlns:html="http://www.w3.org/1999/xhtml">
<>
<>
<>
<>
< height="17" valign="top">

问题是标签名称是空白的。XMLReader(tagsoup 解析器)在 SAX 方法ContentHandler#startElementContentHandler#endElement. 对于不知道命名空间的解析器,这是允许的(参见Javadoc)。

如果我添加一个XMLFilter将 qName 的值复制到 localName 的值,那么一切正常。但是,这不是我想要的,我希望这可以“开箱即用”。我究竟做错了什么?任何输入将不胜感激!

4

1 回答 1

0

我希望这可以“开箱即用”。我究竟做错了什么?

您做错的是采用一种技术(XSLT),该技术被定义为对命名空间格式良好的 XML 进行操作,并试图将其应用于不打算使用的数据。如果要使用 XSLT,则必须启用名称空间,http://www.w3.org/1999/xhtml在样式表中声明名称空间的前缀,并在 XPath 表达式中一致地使用该前缀。

如果您的转换器理解 XSLT 2.0(例如Saxon 9xpath-default-namespace="http://www.w3.org/1999/xhtml" ),那么您可以在XPath 表达式中添加元素名称xsl:stylesheet以使其将未加前缀的元素名称视为对该名称空间的引用,而不是声明前缀和为元素名称添加前缀。但是在 XSLT 1.0(默认的内置 JavaTransformer实现)中,您唯一的选择是使用前缀。

于 2015-06-08T12:43:06.140 回答