Announcement

Collapse
No announcement yet.

XSL - value of mit mehreren Bedingungen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XSL - value of mit mehreren Bedingungen

    Hallo,

    ich bin nicht fit in XSLT und hänge nun mit einem Problem, das ich nicht lösen kann. Mittels dem Buch XSLT 2 .0 habe ich mir die Grundzüge beigebracht, aber nun hänge ich an einem Problem.

    ---- XML Dokument (Ausschnitt) ----

    <xObjekt>
    <xText>
    <xTextoption>
    <xInhalt> (node ist nicht immer vorhanden, sondern nur, wenn mit Inhalt gefüllt!)
    </xInhalt>
    </xTextoption>
    </xText>
    .....
    <xObjekt>
    ....(in sich verschachtelte xObjekt nodes)
    </xObjekt>
    ...
    </xObjekt>
    -----Ende XML Dokument----

    XSL Abfrage, die derzeit funktioniert
    <xsl:for-each select="descendant::xObject[@type='cv9']">
    Somit wähle ich nur die gewünschten Typen an.

    Was ich aber nun abfragen möchte ist:
    - xObject[@type='cv9'] UND istVorhanden(node(xInhalt))
    Ich möchte nur die Objekte auswählen, die 3 Ebenen tiefer den gewünschten Knoten haben - die anderen benötige ich hier nicht und sollen nicht in die Auswahl.

    Mein Problem ist, das sich der Knoten auf den descendant:: Achsen befindet. Weitere Verschachtelungen des xObjekts in sich selbst sind ebenfalls vorhanden.
    Die Prüfung soll allerdings nur die 3te Ebene prüfen ob der dynamisch generierte Knoten vorhanden ist oder nicht.

    Ist das in dieser Art überhaupt möglich?
    Ich hatte auch schon an count(descendant::Text/Textoption/xInhalt) gedacht aber ich weiß ja nicht einmal, wie man mehrere Bedingungen in der value of setzt.
    Wie kann man mehrere Bedingungen setzen, die unterschiedliche nodes betreffen?

    Über Hilfe und Tipps würde ich mich freuen

    Grüße

    Armin
    Armin
    Entwickler Newbie - Quereinsteiger

  • #2
    ein paar schnelle gedanken:

    hallo armin, weiss nicht ob ich das problem ganz richtig verstanden habe, aber hier ein paar inge, die mir einfielen:

    - descendant auf der 3. ebene heisst in anderen worten auch 2x nach unten auf der child achse,oer nicht?
    - ein ist vorhanden realisiert man vielleicht am besten mittels der count funktion, hier ein beispiel: wenn das element test irgenein child hat: <xsl:if test="count(child::*) != 0), in deinem fall also vielleicht descendant::xInhalt

    nur 2 gedanken von mir zu dem thema und ich sehe mich in diesem forum selbst als den einäugigen unter den sehenden...

    viel glück!

    Comment


    • #3
      Hallo,

      Ich weiß jetzt nicht, ob ich dich richtig verstanden habe:
      Du willst alle Knoten haben die im 3. xObjekt child Knoten den entsprechenden Attributwert aufweisen und xInhalt existiert.

      Hier mal so ein grober Entwurf:

      <xsl:template match="xObject">
      <xsl:choose>
      <xsl:when test="child::xObjekt/child::xObjekt/child::xObjekt[@type=..]/xInhalt">
      <xsl:value of select="." />
      <xsl:apply-templates select="xObjekt"/>
      </xsl:when>
      <xsltherwise>
      <xsl:apply-templates select="xObjekt"/>
      </xsltherwise>
      </xsl:choose>
      </xsl:template>
      Das Teil ist bestimmt noch stark optimierungsbedürftig. Nur mal jetzt zur grundsätzlichen Funktion:

      Template prüft ob der 3. Childknoten, falls vorhanden, den entsprechenden Attributwert besitzt und den Unterknoten xInhalt. Wenn ja Wählt er den Knoten aus und wendet das Template nochmal an um weitere Knoten mit diesen Eigenschaften zu finden. Trifft die Bedingung nicht zu wandert er gleich den Objektbaum hinab.

      Comment


      • #4
        Es funktioniert

        Hallo,

        danke für eure Tipps.

        Ich habe es nun nachgeschlagen und getestet - es funktioniert!
        Es ist viel, viel einfacher als ich gedacht habe

        Alt:
        <xsl:for-each select="descendant::xObject[@type='cv9']">

        Neu:
        <xsl:for-each select="descendant::xObject[@type='cv9'] [xText/xTextoption/xInhalt]">

        Einfach die 2te Bedingung hinzugefügt und nun passt es ;-). Die 2te Bedingung prüft, ob der Knoten vorhanden ist, oder nicht.
        Manchmal denkt man einfach zu kompliziert

        Viele Grüße

        Armin
        Armin
        Entwickler Newbie - Quereinsteiger

        Comment

        Working...
        X