2 Stimmen

Bedingter Geschwisterwert

Ich muss ein XSLT schreiben, um den Wert des nächstgelegenen Wörterbuchwertes zu einem bestimmten Knoten zu erhalten. Zum Beispiel könnte meine Struktur wie folgt aussehen

<rootnode>
 <rootcontainer>
  <dictionary>
   <key1> value /<key1>
  </dictionary>
  <pages>
   <page1>
    <!--xslt goes here-->
   </page1>
    </pages>
 </rootcontainer>
 <dictionary>
  <key1>
   independent value
  </key1>
  <key2>
   value 2
  </key2>
 </dictionary>
</rootnode>

Ich möchte Variablen erstellen $key1 y $key2 dentro de page1 . Der Wert von $key1 wird "Wert" sein und der Wert von $key2 wird "Wert 2" sein. Wenn rootcontainer\dictionary\key1 nicht vorhanden ist, wird der Wert von $key1 wird "unabhängiger Wert" sein.

Ich hoffe, das ist sinnvoll.

2voto

Dimitre Novatchev Punkte 234995

Hier finden Sie eine kompakte Möglichkeit, die erforderlichen Variablen zu definieren:

 <xsl:variable name="vKey1" select=
  "(/*/rootcontainer/dictionary/key1
   |
    /*/dictionary/key1
    )
     [1]
  "/>

 <xsl:variable name="vKey2" select=
  "(/*/rootcontainer/dictionary/key2
   |
    /*/dictionary/key2
    )
     [1]
  "/>

Wenn sie in ein einfaches xslt-Stylesheet verpackt sind:

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

 <xsl:variable name="vKey1" select=
  "(/*/rootcontainer/dictionary/key1
   |
    /*/dictionary/key1
    )
     [1]
  "/>

 <xsl:variable name="vKey2" select=
  "(/*/rootcontainer/dictionary/key2
   |
    /*/dictionary/key2
    )
     [1]
  "/>

 <xsl:template match="/">
  Key1: <xsl:value-of select="$vKey1"/>
  Key2: <xsl:value-of select="$vKey2"/>
 </xsl:template>
</xsl:stylesheet>

und auf das bereitgestellte XML-Dokument angewendet (korrigiert, da sie stark fehlerhaft war):

<rootnode>
    <rootcontainer>
        <dictionary>
            <key1> value </key1>
        </dictionary>
        <pages>
            <page1> </page1>
        </pages>
    </rootcontainer>
    <dictionary>
        <key1> independent value </key1>
        <key2> value 2 </key2>
    </dictionary>
</rootnode>

das gewünschte, korrekte Ergebnis erzielt wird :

  Key1:  value 
  Key2:  value 2 

Erläuterung :

Der Ausdruck:

 (/*/rootcontainer/dictionary/key1
|
 /*/dictionary/key1
 )
  [1]

bedeutet :

Man nehme das Nodeset von (möglicherweise) zwei Elementen und entnehme daraus das erste Element in der Reihenfolge der Dokumente.

Da das zweite dieser beiden Elemente in der Dokumentreihenfolge später kommt, wird es nur dann das erste (und ausgewählte) sein, wenn der erste der beiden XPath-Ausdrücke, die die Vereinigung ( | ), wählt kein Element aus.

0voto

biziclop Punkte 47795

Ich bin mir nicht sicher, ob ich die Frage verstehe, aber Sie können einer Variablen auf zwei Arten einen bedingten Wert zuweisen:

<xsl:choose>
   <xsl:when test="your test condition">
      <xsl:variable name="key1" select="your value">
   </xsl:when>
   <xsl:otherwise>
      <xsl:variable name="key1" select="your alternative value">
   </xsl:otherwise>
</xsl:choose>

Oder noch prägnanter:

 <xsl:variable name="key1" select="if(your test condition) then your value else your alternative value;"/>

Aktualisierung: Vielen Dank für die Aktualisierung der Frage. Ich werde es jetzt ausprobieren.

<xsl:template match="page1">
<xsl:choose>
   <xsl:when test="../../preceding-sibling:dictionary[1]/key1">
      <xsl:variable name="key1" select="../../preceding-sibling:dictionary[1]/key1">
   </xsl:when>
   <xsl:otherwise>
      <xsl:variable name="key1" select="../../../following-sibling:dictionary[1]/key1">
   </xsl:otherwise>
</xsl:choose>
</xsl:template>

Daher ist der Wert von $key1 wird die <key1> Knoten im vorangehenden Wörterbuch, wenn es einen gibt, und der <key1> Knoten im folgenden Wörterbuch, wenn er nicht vorhanden ist. Ist das richtig?

(Sie können die if/then/else Struktur auch, wenn Sie das wollen, aber ich habe xsl:choose weil es wahrscheinlich leichter zu lesen ist.)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X