2013-04-09 6 views
14

Ich habe ein XML-Eingabe etwas auf dieser Linie:Wie kann ich mithilfe von XPath feststellen, ob ein Element vorhanden und nicht leer ist?

<Holding id="12"> 
    <Policy> 
     <HoldingForm tc="1">Individual</HoldingForm> 
     <PolNumber>848433</PolNumber> 
     <LineOfBusiness tc="1">Life</LineOfBusiness> 
     <CarrierCode>67644</CarrierCode> 
    </Policy> 
</Holding> 

Meine Manipulation an der XML hängt davon ab, ob <PolNumber> (sein ein optionales Element im Schema) einen Wert hat oder nicht. Ich bin mit Mule 3.3 xpath Auswerter dies und meine XPath tun Ausdruck sieht folgendermaßen aus:

<expression-filter expression="#[xpath('//acord:Holding/acord:Policy/acord:PolNumber').text != empty]"/> 

Das funktioniert gut, solange <PolNumber> Element vorhanden ist oder <PolNumber/> ist leeres Element. Wenn <PolNumber> nicht vorhanden ist, löst der obige Ausdruck die Ausnahme aus.

Ich versuchte mit XPath boolean Funktion, aber es gibt true für <PolNumber/> zurück. Gibt es eine bessere Möglichkeit zu überprüfen, ob ein Element vorhanden und nicht leer ist?

EDIT:

Dies ist die Konfiguration von Namespace-Manager in meinem mule Config

<xm:namespace-manager includeConfigNamespaces="true"> 
    <xm:namespace prefix="acord" uri="http://ACORD.org/Standards/Life/2" /> 
    <xm:namespace prefix="soap" uri="http://schemas.xmlsoap.org/soap/encoding/" /> 
</xm:namespace-manager> 

Antwort

21

Verwendung:

boolean(//acord:Holding/acord:Policy/acord:PolNumber/text()[1]) 

dies erzeugt true() wenn //acord:Holding/acord:Policy/acord:PolNumber einen ersten Text-Knoten Kind hat, und false() anders.

Sie beachten: Das ist effizienter als alle Textknoten Kinder zählen nur die Zählung mit 0

+0

Ich stimme zu, das ist besser als alle Textknotenkinder zu zählen, aber selbst diese Lösung ist nicht vollständig sicher. Dieser X - Pfad wird für ' 'zurückgeben. Ich weiß nicht, wie man eine neue Zeile im Kommentar zeigt, aber meine Absicht war, ein neues Zeilenzeichen zwischen '' und '' –

+2

@Learner zu haben, das ist geradlinig: 'boolean (// acord: Holding/acord : Policy/acord: PolNumber/text() [normalize-space()] [1]) ' –

+1

Danke Dimitre. Ich habe keine Belichtung mit XPath, all das ist sehr hilfreich für mich. –

1

Was count über die Verwendung der Anzahl von Textknoten zu erhalten:

<expression-filter 
    expression="#[xpath('count(//Holding/Policy/PolNumber/child::text())') != 0]"/> 
+0

Vielen Dank für Ihre Antwort. 'Keine solche Funktion {http://www.mulesoft.org/schema/mule/core}:count (org.jaxen.UnresolvableException) org.jaxen.SimpleFunctionContext: 127' Exception wird für die Zählfunktion ausgelöst. –

+0

Ich habe den obigen Ausdruck in '' und das funktionierte jedoch für '' count ist ungleich Null genau wie 'boolean' function –

+0

Seltsam du musst mit' fn' vorangestellt werden. Bearbeite deine Frage und zeige, wie dein Namespace-Manager konfiguriert ist –

8

Sie verwenden können zur Überprüfung, ob es leer ist, aber stellen Sie sicher, Blick in das Element das Element.

boolean(//PolNumber/node()) 

Dies funktioniert auch, wenn andere Knoten enthalten sind. Wenn Sie Textknoten beschränken möchten, ersetzen Sie node() durch text(). Sie könnten stattdessen //text() verwenden, dann liefert die Abfrage auch für Textknoten in anderen untergeordneten Elementen <PolNumber/>.

2

Wie wäre es expression="#[?xpath('//acord:Holding/acord:Policy/acord:PolNumber').text != empty]" zu vergleichen? Dies sollte in allen Situationen funktionieren

0

Vielleicht bin ich ein bisschen spät hier, aber die Antworten sind ein bisschen verwirrend. Dieser gibt immer false zurück, wenn der Text leer ist oder Leerzeichen, aber keine Zeichen.

boolean//Holding/Policy/PolNumber/child/text()[normalize-space()] 
Verwandte Themen