我使用tagsoup作为(SAX) XMLREader
,并将名称空间特性设置为false
。该解析器用于将Transformer
作为SAX源提供。完整代码:
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(标记汤解析器)在SAX方法ContentHandler#startElement
和ContentHandler#endElement
中报告一个空的名称空间euri和空的本地名称。对于不支持名称空间的解析器,这是允许的(参见Javadoc)。
如果我添加一个XMLFilter
,它将qName的值复制到localName,一切都很好。然而,这不是我想要的,我希望这工作"开箱即用"。我做错了什么?任何输入将不胜感激!
我希望这工作"开箱即用"。我做错了什么?
您所做的错误是采用了定义为在名称空间(格式良好的XML)上操作的技术(XSLT),并试图将其应用于它不打算处理的数据。如果希望使用XSLT,那么必须启用名称空间,在样式表中声明http://www.w3.org/1999/xhtml
名称空间的前缀,并在XPath表达式中一致地使用该前缀。
如果您的转换器理解XSLT 2.0(例如Saxon 9),那么您可以将xpath-default-namespace="http://www.w3.org/1999/xhtml"
放在xsl:stylesheet
元素上,使其将未加前缀的元素名称视为对该名称空间的引用,而不是在XPath表达式中声明前缀并为元素名称添加前缀。但是在XSLT 1.0(默认的内置Java Transformer
实现)中,您唯一的选择是使用前缀。