Strings vergleichen
AndreasZ.
- xsl
Guten Tag!
Ich versuche erfolglos 2 Strings zu vergleichen um doppelte Were auszuschliessen:
<xsl:if test="number(position()) = 1">
<xsl:variable name="ele1" select="ELEVATION"/>
<xsl:if test="$ele1">
<xsl:value-of select="$ele1"/>
</xsl:if>
</xsl:if>
<xsl:if test="number(position()) = 2">
<xsl:variable name="ele2" select="ELEVATION"/>
<xsl:if test="not($ele1 = $ele2)">
<xsl:value-of select="$ele2"/>
</xsl:if>
</xsl:if>
die dazugehörige XML in etwa so
<x>
<ELEVATION>10</ELEVATION>
<ELEVATION>20</ELEVATION>
</x>
<x>
<ELEVATION>50</ELEVATION>
<ELEVATION>50</ELEVATION>
</x>
und die Ausgabe sollte so aussehen
10
20
---
50
Ich habe schon mit != und eq probiert, aber auch ohne Erfolg - Ich bekomme immer alles ausgegeben. Kann jemand helfen?
Hallo AndreasZ,
und die Ausgabe sollte so aussehen
10
2050
Ich habe schon mit != und eq probiert, aber auch ohne Erfolg - Ich bekomme immer alles ausgegeben.
eq deutet auf die Nutzung von XSLT/XPath 2.0 hin. Dann wäre fn:distinct-values() nützlich:
<xsl:for-each select="x">
<xsl:value-of select="fn:distinct-values(ELEVATION)" separator="
"/>
<xsl:if test="position() != last()">
<xsl:text>
---
</xsl:text>
</xsl:if>
</xsl:for-each>
Grüße,
Thomas
Hallo AndreasZ,
und die Ausgabe sollte so aussehen
10
2050
Ich habe schon mit != und eq probiert, aber auch ohne Erfolg - Ich bekomme immer alles ausgegeben.
eq deutet auf die Nutzung von XSLT/XPath 2.0 hin. Dann wäre fn:distinct-values() nützlich:
<xsl:for-each select="x">
<xsl:value-of select="fn:distinct-values(ELEVATION)" separator="
"/>
<xsl:if test="position() != last()">
xsl:text
---
</xsl:text>
</xsl:if>
</xsl:for-each>
>
> Grüße,
> Thomas
Hallo Thomas,
ich war über das verlängerte Wochenede nicht da um zu antworten. Vielen Dank für deine Idee mit dem distinct. Die richtige Anzeige bekomme ich noch nicht hin.
~~~xml
<x>
<SECTOR>
<ELEVATION>106</ELEVATION>
</SECTOR>
<SECTOR>
<ELEVATION>61</ELEVATION>
</SECTOR>
</x>
<x>
<SECTOR>
<ELEVATION>19</ELEVATION>
</SECTOR>
<SECTOR>
<ELEVATION>19</ELEVATION>
</SECTOR>
<SECTOR>
<ELEVATION>19</ELEVATION>
</SECTOR>
<SECTOR>
<ELEVATION>19</ELEVATION>
</SECTOR>
<SECTOR>
<ELEVATION>19</ELEVATION>
</SECTOR>
</x>
das ergibt mit deinem Code
106 ---
61
19 ---
19 ---
19 ---
19 ---
19
Deine Vermutung mit xslt (fo) war richtig.
Gruß Andreas
Ich glaube, ich sehe das Übel gerade. Mein Apache FOP 1.1 (mehr habe/darf ich auch nicht) scheint nur XSLT 1.0 zu verstehen. Damit ist der distinct-Befehl nix. Verdammt!
Hallo AndreasZ,
Ich glaube, ich sehe das Übel gerade. Mein Apache FOP 1.1 (mehr habe/darf ich auch nicht) scheint nur XSLT 1.0 zu verstehen. Damit ist der distinct-Befehl nix. Verdammt!
Mit XSLT 1.0 lässt es sich so umsetzen (Demo mit Ausgabe über HTML-Listen):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" indent="yes"/>
<xsl:template match="root">
<html>
<head>
<title>Test</title>
</head>
<body>
<xsl:apply-templates select="x"/>
</body>
</html>
</xsl:template>
<xsl:template match="x">
<ul>
<xsl:for-each select="SECTOR/ELEVATION[not(. = ../preceding-sibling::SECTOR/ELEVATION)]">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
</xsl:template>
</xsl:stylesheet>
Relevante Ausgabe:
<ul>
<li>106</li>
<li>61</li>
</ul>
<ul>
<li>19</li>
</ul>
Das lässt sich entsprechend auf die Zielstruktur übertragen (für FO mit fo:block / fo:inline).
Grüße,
Thomas