# xslt zum Rausfiltern von Feldern in XML wenn variable gleich false



## Wiplash4 (22. Apr 2022)

Ich versuche gerade ein Stueck xslt code zu basteln, welcher eine Variable aus dem xml filtert, aber nur dann, wenn eine andere Variable false ist.


```
<xmldoc1>
<xmldoc2>
<xmldoc3>
<variable1>#Var1</variable1>
<variable2>#Var2</variable2>
<variable3>#Var3</variable3>
</xmldoc3>
</xmldoc2>
</xmldoc1>
```

Die Kondition heisst if #Var2==false, dann soll <variable1> rausgefiltert werden.
Der Wert von #Var1 und #Var3 ist egal.

Wenn #Var2=true dann

```
<xmldoc1>
<xmldoc2>
<xmldoc3>
<variable1>#Var1</variable1>
<variable2>#Var2</variable2>
<variable3>#Var3</variable3>
</xmldoc3>
</xmldoc2>
</xmldoc1>
```

Wenn #Var2=false dann

```
<xmldoc1>
<xmldoc2>
<xmldoc3>
<variable2>#Var2</variable2>
<variable3>#Var3</variable3>
</xmldoc3>
</xmldoc2>
</xmldoc1>
```

Weiss da jemand weiter?


----------



## KonradN (22. Apr 2022)

Was hast Du denn bisher schon aufgebaut um das XML in ein weiteres XML zu überführen? Hast Du da schon erste Ansätze, bei denen man dann aufzeigen könnte, was Du ggf. prüfen kannst?

Und wie ist der Aufbau exakt? Sind diese xmldoc1 xmldoc2 und xmldoc3 fix? Kommen die ggf, mehrfach vor? Kann die Ebene sich ändern?
Sind die variable1m variable2 und variable3 fix? 

Wenn Du bei der Verarbeitung bei xmldoc3 bist, dann kannst Du für jedes Subelement prüfen:
Wenn der TagName (abfragbar mit name() ) nicht variable1 ist oder der Inhalt von ../variable2/text() ungleich false ist, dann schreibst dann das aktuelle Element  (dürfte etwas sein wie <xsl:copy-of select="." />). 

Generell ist das gar nicht besonders komplex - https://www.data2type.de/xml-xslt-xslfo/xslt/xslt-einfuehrung gibt eine gute Einführung und zeigt auch Beispiele auf wie Bedingungen umgesetzt werden können. Wichtig ist, dass Du da halt mit XPath sehr gut und viel selektieren kannst. 

So ganz aus dem Kopf sicher aufschreiben kann ich das auch nicht - da müsste man halt doch konkrete Beispiele haben um das dann ggf. etwas durchzuspielen. Sowas baue ich immer Schritt für Schritt zusammen mit ständigen Tests. Dann sieht man Fehler auch in der Regel sehr schnell.


----------



## Oneixee5 (22. Apr 2022)

So in der Art? Du zeigst dein XSLT ja nicht, man weiß also gar nicht wo du das integrieren willst.

```
<xsl:template match="variable1">
    <xsl:if test="../variable2 != 'false'">
        <xsl:copy-of select="node()"/>
    </xsl:if>
</xsl:template>
```


----------



## Wiplash4 (23. Apr 2022)

Oha, die Antworten kommen ja schnell. Leider kann der obige Code das Problem nicht beheben.


----------



## Oneixee5 (23. Apr 2022)

Zeig doch mal was du bereits hast. Sonst kann die nicht geholfen werden.


----------



## Wiplash4 (23. Apr 2022)

Das geht leider nicht. Aber ich weiss, warum es nicht klappt. Es geht um die Abfrage des Wertes von <variable2>.

Daher meine Frage: Wie kann man den Wert von <variable2> in eine <xsl:variable name="v1" kriegen? Damit meine ich #Var2. Wenn also #Var2 gleich 'false' ist, dann soll die Variable v1 auch 'false' sein; wenn #Var2 gleich 'true', dann v1 eben auch 'true'.


----------



## KonradN (23. Apr 2022)

Hast du denn mal das /text() angehängt an variable2? Also den XPATH ../variable2/text() statt ../variable2?

Und du kannst doch jederzeit ein Beispiel XML / XSLT bauen, das das Problem aufzeigt. Also sowas wie ein minimales Beispiel!

Und es geht immer darum, wie du Dein XSLT aufbaust. Du kannst alles mit Template Matches machen aber du kannst auch eine Ebene drüber sein um dann die Elemente zu platzieren / zu behandeln. Daher ist es halt so wichtig, dass du uns mehr gibst. Dann kann man auch ein xslt liefern, das wir selbst getestet haben.


----------



## Wiplash4 (23. Apr 2022)

Danke dir KonradN, ich weiss das wirklich zu schaetzen.

Meintest du das hier:

```
<xsl:variable name="v1"><xsl:value-of select="boolean(//variable2)"></xsl:variable>
```

Habe das nach etwas experimentieren rausgefunden.


----------

