2016-10-24 2 views
1

Ich würde gerne wissen, wie Wert von unten xml erhalten. Ich habe einige verschiedene Ansätze ausprobiert und es scheint, dass ich die richtige Lösung nicht finden kann. Ich brauche Wert von <a><b><c><d><dValue>XSLT-Wert auswählen basierend auf mehreren Tags und seine Werte

  • wenn <a><aid> Wert ok ist
  • wenn <a><b><bid> Wert ok ist
  • wenn <a><b><c><cid> Wert
  • dann ok ist
  • :

    <a> 
        <aid>ok</aid> 
        <b> 
         <bid>ok</bid> 
         <c> 
          <cid>ok</cid> 
          <d> 
           <dValue>goal</dValue> 
          </d> 
         </c> 
        </b> 
    </a> 
    

    Zustand muss unter Kriterien erfüllen

Jede Hilfe würde sehr geschätzt werden, da ich schon einige Stunden damit verbracht habe :) Oh, ich benutze xslt 2.0.

Antwort

3
<xsl:value-of select="a[aid='ok']/b[bid='ok']/c[cid='ok']/d/dValue"/> 
+0

Arbeitete in ersten Versuch. Ich war nicht weit, aber ich machte Fehler in Klammern, so dass ich bei meinen Versuchen nichts fand. Danke – Matjaz

1

Eine allgemeinere Aufgabe:

Falls die Namen der Elemente keine Rolle spielen und die Tiefe des Pfades (Anzahl der verschachtelten Elementen) kann jeder sein, aber die Kinder haben als nennen Sie den Namen des Elternteils mit „id“ angehängt, dann ist diese XPath 2.0-Ausdruck produses das gewünschte Ergebnis in allen solchen Fällen, einschließlich der aktuellen:

//dValue[every $anc in ../ancestor::* 
      satisfies $anc/*[name() eq concat($anc/name(), 'id')]/string() eq 'ok' ]/string() 

XSLT 2.0 Überprüfung :

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

    <xsl:template match="/"> 
    <xsl:sequence select= 
    "//dValue[every $anc in ../ancestor::* 
     satisfies $anc/*[name() eq concat($anc/name(), 'id')]/string() eq 'ok' ]/string()"/> 
    </xsl:template> 
</xsl:stylesheet> 

Wenn diese Transformation auf dem bereitgestellten XML Dokument angewandt wird:

<a> 
    <aid>ok</aid> 
    <b> 
     <bid>ok</bid> 
     <c> 
      <cid>ok</cid> 
      <d> 
       <dValue>goal</dValue> 
      </d> 
     </c> 
    </b> 
</a> 

es wertet den Ausdruck und gibt das Ergebnis dieser Auswertung:

goal 

Anwenden der gleichen Transformation auf dieses XML-Dokument:

<x> 
    <xid>ok</xid> 
    <y> 
     <yid>ok</yid> 
     <z> 
      <zid>ok</zid> 
      <t> 
       <dValue>goal2</dValue> 
      </t> 
     </z> 
    </y> 
</x> 

produziert wieder das wollte korrekte Ergebnis:

goal2 
+0

Auch wenn es eine gute Lösung ist, scheint es in meinem Fall übertrieben. Aber es ist notiert, wenn ich es in der Zukunft brauche, danke. – Matjaz

+2

@Matjaz, ich schrieb dies, weil Sie XPath 2.0-Lösungen wollten :) –

Verwandte Themen