2009-07-21 17 views
2

Ich habe Probleme beim Schreiben eines XPath-Ausdrucks, um Knoten auszuwählen, die bestimmte Elemente enthalten, während Geschwister dieses Elements ausgeschlossen sind, an denen ich nicht interessiert bin. Ich vermute, dass dies nicht mit XPath allein und mit I möglich ist muss XSLT verwenden.XPath-Auswahl

Mit diesem Quelldokument

<items> 
    <item id="foo1"> 
     <attr1>val1</attr1> 
     <attr2>val2</attr2> 
     <attr3>val3</attr3> 
     <interestingAttribute>val4</interestingAttribute> 
    </item> 
    <item id="foo2"> 
     <attr1>val5</attr1> 
     <attr2>val6</attr2> 
     <attr3>val7</attr3> 
    </item> 
    <item id="foo3"> 
     <attr1>val8</attr1> 
     <attr2>val9</attr2> 
     <attr3>val10</attr3> 
     <interestingAttribute>val11</interestingAttribute> 
    </item> 
</items> 

Ich möchte dieses Ergebnis erzeugen

<items> 
    <item id="foo1"> 
     <interestingAttribute>val4</interestingAttribute> 
    </item> 
    <item id="foo3"> 
     <interestingAttribute>val11</interestingAttribute> 
    </item> 
</items> 

Kann dies mit XPath getan werden? Wenn nicht, welche XSLT-Transformation sollte ich verwenden?

+0

Möchten Sie das gesamte XML generieren, die Sie oben als Ergebnis haben? Oder möchten Sie nur, dass diese bestimmten Knoten von einem X-Pfad in Ihrer Codebasis durchlaufen? –

+0

Ich würde es vorziehen, das gesamte XML-Dokument zu generieren. Aber wenn es eine XPath-Lösung gibt, die das -Element ausschließt, ist das auch in Ordnung. – Chris

Antwort

4

XPath wird verwendet, um bestimmte Knoten auszuwählen, und es wird Ihnen keine Baumstruktur geben, wie Sie möchten. Sie können höchstens eine Knotenliste abrufen, und aus der Knotenliste können Sie die Baumstruktur ableiten. Wenn alles, was Sie wirklich hier wollen, ist die interessante Attribute auswählen, können Sie diese XPath versuchen:

/items/item/interestingAttribute 

Wenn Sie den Baum generieren möchten, müssen Sie XSLT benötigen. Diese Vorlage sollte es tun:

<xsl:template match="/items"> 
    <xsl:copy> 
     <xsl:for-each select="item[interestingAttribute]"> 
      <xsl:copy> 
       <xsl:copy-of select="@* | interestingAttribute"/> 
      </xsl:copy> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 
+0

Tippfehler behoben, danke für das Aufzeigen – Chris

2

Dies wird nur <item> s auswählen, die <interestingAttribute> Kinder haben:

/items/item[interestingAttribute] 

oder Sie können die <interestingAttribute> Elemente selbst wie so wählen:

/items/item/interestingAttribute 

Diese beiden Ausdrücke Sie eine node- zurück geben Set, eine Liste von XML-Knoten. Wenn Sie wirklich versuchen, ein Dokument in ein anderes zu transformieren, werden Sie wahrscheinlich XSLT verwenden wollen, aber denken Sie daran, dass XPath eine Kernkomponente von XSLT ist, also werden Sie sicherlich XPath-Ausdrücke wie die oben genannten verwenden, um die Transformation zu steuern.