XPath Vergleich von Ausdrücken, die mehrere Punkte enthalten

Gloki

Grünschnabel
Hallo zusammen,

ich habe da ein kleines Problem. Und zwar sichere ich in einem XML-Dokument die Bezeichnung und Version mehrerer Programme. Nun möchte ich über XPath alle Programme suchen, deren Versionsnummer (z.B.) zwischen 1.0.0 und 2.0.0 liegen. Also ungefähr so:
Code:
\\Version[.>='1.0.0' and .<='2.0.0']

Bei dieser Abfrage bekomme ich allerdings keine Knoten zurück, obwohl es solche Werte im Dokument gibt.
Ich denke das Problem liegt bei den zwei Punkten in einem Ausdruck, denn mit einem Punkt funktioniert es einwandfrei.

Gibt es hierfür evtl. ein Workaround oder sonst einen Trick?

Vielen Dank schonmal
Gloki
 
Hi.

Das Problem ist, das wenn du die Vergleichsoperatoren (< <= > >=) verwendest, das die Operanden in Zahlen konvertiert werden, was allerdings für Werte wie '2.0.3' nicht möglich ist, da es kein gültiges Zahlenformat ist. Das Ergebnis der Konvertierung ist dan NaN - not a number.

Du könntest z.B. die Versionsnummern in eine Zahl per Hand umrechnen und dann vergleichen. Unter der Annahme, das ein Teil einer Versionszahl nicht mehr als 3 Stellen besitzt, kannst du das folgende template nutzen:
XML:
<xsl:template name="ver2num">
  <xsl:param name="text"/>
  <xsl:param name="accu" select="0"/>
  <xsl:choose>
    <xsl:when test="contains($text, '.')">
      <xsl:call-template name="ver2num">
	<xsl:with-param name="text" select="substring-after($text, '.')"/>
	<xsl:with-param name="accu" select="$accu*1000+substring-before($text, '.')"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$accu*1000+number($text)"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
Das heißt eine Versionsnummer wie 2.0.3 würde umgerechnet in 2000003 und könnte dann z.B. mit 1.3.38 (umgerechnet 1003038) verglichen werden.

Gruß
 
Zuletzt bearbeitet von einem Moderator:
Hi deepthroat

'2.0.3' nicht möglich ist, da es kein gültiges Zahlenformat ist.

Sowas habe ich mir schon fast gedacht. Dann muss ich halt doch noch ein wenig Code schreiben :suspekt:

Vielen Dank für deine Antwort
Gloki
 

Neue Beiträge

Zurück