vícenásobné použití stejné pasáže pomocí xpointer

Tomas.Waller Tomas.Waller na seznam.cz
Pátek Březen 26 11:03:17 CET 2010


Dobrý den!

Potřeboval bych poradit. Mám základní soubor, do nějž pomocí XInclude inkluduji soubory pro chapters a do těch pro sections.

Potřebuji jednu mysection.xml zahrnout do hlavního souboru book.xml dvakrát.

Zkouším tedy toto:

v book.xml mám:

<chapter id="mychapter">
<title>mychaptertitle</title>
    <xi:include href="mysection.xml" xmlns:xi="http://www.w3.org/2001/XInclude"></xi:include>
</chapter>

<chapter id="mychapter2">
<title>mychapter2title</title>
<section id="my-new-id">
    <xi:include href="mysection.xml" xpointer="xpointer(/section/*)" xmlns:xi="http://www.w3.org/2001/XInclude" />
</section>
</chapter>

kde v mysection.xml má tato section id="my-id".

Tedy poprvé chci tuto section s původním id a podruhé jen její potomky, kterým přiřadím nové id="my-new-id".

Používám saxon a fop

Abych zahrnul jeden text víckrát, vím dosud o 3 možnostech: xmllint, xincluder a xom.

1) funguje mi xmllint.exe --xinclude book.xml > bookresolved.xml
tehdy se id opravdu nahradí novým při druhém výskytu mysection.xml 

Potřeboval bych ale použít raději příkaz javy.

2) Zkusil jsem 
java -cp "../../xinclude/xincluder.jar;../../xerces/xercesImpl.jar" com.elharo.xml.xinclude.SAXXIncluder book.xml > bookresolved.xml

To mi sice zahrne sekci dvakrát, ale při druhém výskytu mi nenahradí id, prostě tam vrazí celou section včetně původního id. Takže je tam duplicitní id. Mám pocit, že toto xpointer="xpointer(/section/*)" se ignoruje.

3) Když jsem zkusil:

java  -cp "../../XOM/xom-1.2.1.jar;../../XOM/xom-samples.jar" nu.xom.samples.XIncludeDriver book.xml  >  bookresolved.xml

spadne to na NPE s tímto výpisem:

nu.xom.ParsingException in book.xml
nu.xom.ParsingException in book.xml
	at nu.xom.Builder.build(Builder.java:1183)
	at nu.xom.Builder.build(Builder.java:574)
	at nu.xom.samples.XIncludeDriver.main(XIncludeDriver.java:50)
Caused by: java.lang.NullPointerException
	at nu.xom.XOMHandler.inInternalSubset(XOMHandler.java:554)
	at nu.xom.XOMHandler.attributeDecl(XOMHandler.java:571)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.attributeDecl(AbstractSAXParser.java:951)
	at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDProcessor.attributeDecl(XMLDTDProcessor.java:1082)
	at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.scanAttlistDecl(XMLDTDScannerImpl.java:1246)
	at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.scanDecls(XMLDTDScannerImpl.java:1983)
	at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.scanDTDExternalSubset(XMLDTDScannerImpl.java:320)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1202)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1090)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:977)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
	at com.sun.org.apache.xerces.internal.parsers.DTDConfiguration.parse(DTDConfiguration.java:496)
	at com.sun.org.apache.xerces.internal.parsers.DTDConfiguration.parse(DTDConfiguration.java:552)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
	at nu.xom.Builder.build(Builder.java:1161)
	... 2 more

Poradil by mi někdo? Jak to zařídit, abych mohl používat xpointer()? Proč je v druhém případě xpointer() ignorován a proč v případě xom zpracování padá na NPE.

Předem děkuji.

Tomáš Waller



Další informace o konferenci Docbook