2017-05-11 4 views
0

Ich verwende xinclude einige Teile des Dokuments in einem anderen Dokument zu enthalten, zum Beispiel in meinem Hauptdokument ich habe:XPath - wählen Sie alle Elemente mit Ausnahme Elemente (und es ist Subelemente) mit bestimmtem Attribute

<document> 
    <xi:include href="included.xml" 
    xpointer = "xpointer(*//[@condition="cond1" or not(@condition)])" 
    xmlns:xi="http://www.w3.org/2001/XInclude" /> 
</document> 

und mein included.xml wie folgt aussieht:

<root> 
    <chapter> 
    <section condition="cond1"> 
     <para> Condition 1 Para </para> 
    </section> 

    <section condition="cond2"> 
     <para> Condition 2 Para </para> 
    </section> 
    </chapter> 
</root> 

Meine Frage ist, wie kann ich alles auswählen, Beibehaltung der richtigen Struktur AUSSER Element mit Attributbedingung = „cond2“ und auch nichts davon ist Kind-Elemente? Deshalb möchte ich

<root> 
    <chapter> 
    <section condition="cond1"> 
     <para> Condition 1 Para </para> 
    </section> 
    </chapter> 
</root> 

Die xpointer Ich habe wählen ist es nicht:

xpointer(*//[@condition="cond1" or not(@condition)]) 

Antwort

0

Beginnen Sie mit der Syntax Festsetzung:

//*[@condition="cond1" or not(@condition)] 

Dann wieder Blick auf die Anforderungen: " EXCEPT Element mit Attribut condition = "cond2"

Das wäre

//*[not(@condition="cond2")] 

Jetzt das knifflige Bit: "und auch keine seiner Kindelemente". Im Fragetitel nennst du sie 'Unterelemente' - ich nehme an, dass du in jeder Tiefe absteigende Elemente meinst.

Die wörtliche Antwort ist

//*[not(ancestor-or-self::*[@condition="cond2"])] 

Aber an diesem Punkt müssen wir stoppen. Du hast diese Frage mit XPath getaggt, aber es geht nicht wirklich um XPath, es geht um XPointer. Insbesondere geht es um einen XPointer, der das xpointer() - Schema verwendet, das nur als ein W3C-Arbeitsentwurf von 2002 existiert, der nie fertiggestellt wurde. Siehe https://www.w3.org/TR/xptr-xpointer/. Zuerst müssen wir feststellen, welche XPointer-Implementierung Sie tatsächlich verwenden und welcher Spezifikation sie entspricht.

Und dann müssen wir darüber nachdenken, was Sie in Bezug auf XInclude erreichen wollen. Ich denke, Sie versuchen, nicht einen Satz ausgewählter Elemente einzubeziehen, sondern einen ganzen Baum mit einigen entfernten Unterbäumen. Wenn Sie einen Knoten auswählen, der mit XInclude eingeschlossen werden soll, wird dieser Knoten zusammen mit dem Teilbaum, der an diesem Knoten verwurzelt ist, eingefügt, unabhängig davon, ob die untergeordneten Knoten explizit ausgewählt wurden oder nicht. Sie können XInclude nicht verwenden, um eine Transformation der von Ihnen eingeschlossenen Struktur durchzuführen.

Es ist also nicht nur ein Syntaxproblem oder ein XPath-Problem. Sie verwenden im Grunde das falsche Werkzeug für den Job.

Verwandte Themen