0

tagsoup as (SAX)を使用XMLREaderし、名前空間機能を に設定しますfalse。このパーサーはTransformer、SAX Source としてフィードするために使用されます。完全なコード:

    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">

問題は、タグ名が空白であることです。ContentHandler#startElementXMLReader (tagsoup パーサー) は、SAX メソッドおよびで空の namespaceURI と空のローカル名を報告しますContentHandler#endElement。名前空間を認識しないパーサーの場合、これは許可されます ( Javadocを参照)。

XMLFilterqName の値を localName にコピーする a を追加すると、すべてうまくいきます。ただし、これは私が望んでいるものではありません。これは「箱から出して」動作することを期待しています。私は何を間違っていますか?任意の入力をいただければ幸いです。

4

1 に答える 1

0

これは「箱から出して」動作することを期待しています。私は何を間違っていますか?

あなたが間違っているのは、名前空間の整形式 XML で動作するように定義されたテクノロジ (XSLT) を使用し、それを使用する予定のないデータに適用しようとすることです。XSLT を使用する場合、名前空間を有効にし、スタイルシートで名前空間のプレフィックスを宣言し、http://www.w3.org/1999/xhtmlそのプレフィックスを XPath 式で一貫して使用する必要があります。

トランスフォーマーが XSLT 2.0 (例: Saxon 9 ) を理解する場合、プレフィックスを宣言して XPath 式で要素名にプレフィックスを付ける代わりに、プレフィックスを付けない要素名をその名前空間への参照として扱うように要素をxpath-default-namespace="http://www.w3.org/1999/xhtml"配置できます。xsl:stylesheetしかし、XSLT 1.0 (デフォルトの組み込み JavaTransformer実装) では、唯一のオプションはプレフィックスを使用することです。

于 2015-06-08T12:43:06.140 に答える