3

この例が何度か投稿されているのを見てきました。

public class XIncludeTest {

  public static void main(String[] args) throws Exception {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      factory.setNamespaceAware(true);
      factory.setXIncludeAware(true);
      DocumentBuilder docBuilder = factory.newDocumentBuilder();
      System.out.println("isXIncludeAware " + docBuilder.isXIncludeAware());
      Document doc = docBuilder.parse(args[0]);

      Transformer transformer = TransformerFactory.newInstance().newTransformer();
      transformer.setOutputProperty(OutputKeys.INDENT, "yes");

      //initialize StreamResult with File object to save to file
      StreamResult result = new StreamResult(new StringWriter());
      DOMSource source = new DOMSource(doc);
      transformer.transform(source, result);

      String xmlString = result.getWriter().toString();
      System.out.println(xmlString);    
    }
}

この単純な xml ファイルを次の場所に渡します。

a.xml
<?xml version="1.0" encoding="UTF-8"?>
<a xmlns:xi="http://www.w3.org/2003/XInclude">
  <xi:include href="b.xml" xpointer="element(/b/c)"/>
  <xi:include href="b.xml" xpointer="element(/b/d)"/>
</a>

b.xml
<?xml version="1.0" encoding="UTF-8"?>
<b>
  <c>1</c>
  <d>2</d>
</b>

そして、上記のように、a.xml の内容だけが返されます。b.xml の部分は含まれていません。xpointer 構文の無限のバリエーションを試しましたが、役に立ちませんでした。ただし、XML::LibXML を介して perl で動作させることができましたが、Java で動作させるにはこれが必要です。

何が得られないのですか?

OK、これで xml ファイルが機能するものに更新されました。

a.xml
<?xml version="1.0" encoding="UTF-8"?>
<a xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="b.xml" xpointer="element(/1/1)"/>
  <xi:include href="b.xml" xpointer="element(/1/2)"/>
</a>

ドキュメントにオフセットを使用したくない - 名前ははるかに優れています (a.xml の最初のバージョンのように)。私はXPointer Frameworkを理解しようとしており、XPath と XPointer/XPointer Syntaxも参照として使用しています。NCName が ID タイプの属性と一致する場合にのみ、「省略形」ポインターを使用できるはずです。問題は、「ID タイプ属性」を定義する DTD またはスキーマがないことです。Java パーサーが xpointer スキーマをサポートしていない場合、インデックスを使用する唯一のオプションはありますか?

4

1 に答える 1

3

xi プレフィックスの名前空間は "http://www.w3.org/2001/XInclude" にする必要があります (2003 ではなく 2001 に注意してください)。詳細については、 http://www.w3.org/TR/xinclude/を参照してください。

これにより、次の問題と思われるものにたどり着きます。要素スキーム xpointer の構文が正しくありません。詳細については、 http://www.w3.org/TR/xptr-element/を参照してください。

于 2011-10-11T17:27:08.753 に答える