Я использую tagsoup как (SAX) XMLREader
и задаю функцию пространства имен false
. Этот синтаксический анализатор используется для подачи Transformer
в качестве источника SAX. Полный код:Как сделать преобразование XSL в Java, используя парсер, не содержащий имен пространства имен?
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 (tagoup parser) сообщает о пустом пространстве именURI и пустом локальном имени в методах SAX ContentHandler#startElement
и ContentHandler#endElement
. Для анализатора, не содержащего пространства имен, это разрешено (см. Javadoc).
Если я добавлю XMLFilter
, который копирует значение qName в localName, все будет хорошо. Однако это не то, что я хочу, я ожидаю, что это будет работать «из коробки». Что я делаю не так? Любой вход был бы оценен!
Зачем вам нужно использовать XSLT с XmlReader, который не поддерживает пространства имен? Известно, что XSLT/XPath требует корректного ввода пространства имен. –
Если пространства имен разрешены, мне нужны выражения xpath, такие как 'h: html/h: body/h: table/h: tbody/h: tr' вместо' html/body/table/tbody/tr' (короткий ответ: потому что я ленив и/или мои знания xslt сосет). – rmuller
Обратите внимание, что в TagSoup в соответствии с http://home.ccil.org/~cowan/tagsoup/#program есть опция '--nons' для подавления пространств имен (пространство имен подавляется.). Я бы предположил, что вы можете включить это, используя свой API, и в этом случае, когда вы анализируете HTML, элементы, о которых идет речь, не должны содержать пространства имен (которое может обрабатывать XSLT/XPath). –