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