2016-09-13 1 views
1

Ich sah mehrere Stackoverflow-Posts, um eine Antwort zu finden, konnte aber nicht. Ich habe so viele Möglichkeiten versucht, aber nichts scheint zu funktionieren.xPath - Standard-Wert zurückgeben, wenn der Knoten fehlt?

Ich möchte gsRating der Schulen unten finden, aber viele seiner optionalen Tag. Also wollte ich als Abwesenheitswert -1 zurückgeben.

Hier XML:

<?xml version="1.0" encoding="UTF-8"?> 
<schools> 
    <school> 
     <gsId>87</gsId> 
     <name>James Leitch Elementary School</name> 
     <type>public</type> 
     <gradeRange>K-3</gradeRange> 
     <enrollment>1075</enrollment> 
     <gsRating>10</gsRating> 
     <parentRating>4</parentRating> 
     <city>Fremont</city> 
     <state>CA</state> 
     <districtId>8</districtId> 
     <district>Fremont Unified</district> 
     <districtNCESId>0614400</districtNCESId> 
     <address>47100 Fernald Street, 
Fremont, CA 94539</address> 
     <phone>(510) 657-6100</phone> 
     <fax>(510) 659-9298</fax> 
     <website>http://www.jleitch.edu/</website> 
     <ncesId>061440001673</ncesId> 
     <lat>37.486492</lat> 
     <lon>-121.92332</lon> 
     <overviewLink>http://www.greatschools.org/california/fremont/87-James-Leitch-Elementary-School/?s_cid=gsapi</overviewLink> 
     <ratingsLink>http://www.greatschools.org/school/rating.page?state=CA&amp;id=87&amp;s_cid=gsapi</ratingsLink> 
     <reviewsLink>http://www.greatschools.org/school/parentReviews.page?state=CA&amp;id=87&amp;s_cid=gsapi</reviewsLink> 
     <distance>1.12</distance> 
     <schoolStatsLink>http://www.greatschools.org/modperl/achievement/CA/87</schoolStatsLink> 
    </school> 
    <school> 
     <gsId>107</gsId> 
     <name>Fred E. Weibel Elementary School</name> 
     <type>public</type> 
     <gradeRange>K-6</gradeRange> 
     <enrollment>853</enrollment> 
     <parentRating>4</parentRating> 
     <city>Fremont</city> 
     <state>CA</state> 
     <districtId>8</districtId> 
     <district>Fremont Unified</district> 
     <districtNCESId>0614400</districtNCESId> 
     <address>45135 South Grimmer Boulevard, 
Fremont, CA 94539</address> 
     <phone>(510) 651-6958</phone> 
     <fax>(510) 651-6653</fax> 
     <website>http://www.fremont.k12.ca.us/weibel/</website> 
     <ncesId>061440009139</ncesId> 
     <lat>37.507336</lat> 
     <lon>-121.92837</lon> 
     <overviewLink>http://www.greatschools.org/california/fremont/107-Fred-E.-Weibel-Elementary-School/?s_cid=gsapi</overviewLink> 
     <ratingsLink>http://www.greatschools.org/school/rating.page?state=CA&amp;id=107&amp;s_cid=gsapi</ratingsLink> 
     <reviewsLink>http://www.greatschools.org/school/parentReviews.page?state=CA&amp;id=107&amp;s_cid=gsapi</reviewsLink> 
     <distance>1.14</distance> 
     <schoolStatsLink>http://www.greatschools.org/modperl/achievement/CA/107</schoolStatsLink> 
    </school> 
</schools> 

wie unten versucht:

//schools/school[*]/(gsRating/string(),'-1')[1] 

Antwort

1

wie unten versucht:

//schools/school[*]/(gsRating/string(),'-1')[1] 

verwenden XPath 2.0-Ausdruck:

/*/*/(string(gsRating)[.], -1)[1] 

Wenn Sie gsRatings Elemente verwerfen wollen, deren Wert String white-space, verwenden Sie:

/*/*/(normalize-space(gsRating)[.], -1)[1] 

Wenn Sie möchten, können Nummer, Verwendung nicht gegossen werden alle gsRatings deren String-Wert zu verwerfen:

/*/*/(normalize-space(gsRating)[number(.) eq number(.)], -1)[1] 

Hier ist ein XSLT-basierte Verifikation:

Zur Vereinfachung Lassen Sie uns dieses XML-Dokument haben:

<schools> 
    <school> 
     <gsRating>10</gsRating> 
    </school> 
    <school> 
     <noRating>10</noRating> 
    </school> 
    <school> 
     <gsRating> t </gsRating> 
    </school> 
    <school> 
     <gsRating/> 
    </school> 
    <school> 
     <gsRating> </gsRating> 
    </school> 
</schools> 

Wenn diese XSLT-Transformation:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

    <xsl:template match="/*"> 
    <xsl:value-of select= 
      "/*/*/(normalize-space(gsRating)[number(.) eq number(.)], -1)[1]"/> 
    </xsl:template> 
</xsl:stylesheet> 

auf dem XML-Dokument oben angelegt wird, wird der XPath-Ausdruck ausgewertet und das Ergebnis es (eine Folge von ganzen Zahlen) erzeugt wird ausgegeben:

10 -1 -1 -1 -1 
1

Dieser XPath 2.0-Ausdruck,

for $s in //school 
    return concat($s/name, ', ', if ($s/gsRating) then $s/gsRating else '-1') 

kehrt

James Leitch Elementary School, 10 
Fred E. Weibel Elementary School, -1 

für Ihre Beispiel-XML.