Hallo,
ich bin noch ziemlich neu in dieser Materie und stehe vor meinem ersten großen Problem, zu dem ich leider bis jetzt keine Information gefunden habe. Hoffentlich ist es trotzdem lösbar.
Ich habe folgende XML Struktur:
<?xml version="1.0"?>
<tree>
<node>
<name>Menüpunkt 2</name>
<node>
<name>Untermenüpunkt 1</name>
</node>
<node>
<name>Langer Untermenüpunkt 2</name>
</node>
</node>
</tree>Ich möchte nun die längste string-length() des Attributs "name" unterhalb von "Menüpunkt 2" ermitteln. Das wäre in dem Fall "23". Wie gehe ich vor?
Du hast kein einziges Attribut in deinem XML (mal von version="1.0" abgesehen).
Wenn du deutsche Umlaute etc. in deinem XML verwendest, nimm
<?xml version="1.0" encoding="iso-8859-1"?>
Erstens definierst du einen Template:
<xsl:template name="hoechste">
<xsl:param name="knoten" />
<xsl:if test="$knoten and not($knoten[string-length(.) != string-length(.)])">
<xsl:variable name="max">
<xsl:for-each select="$knoten">
<xsl:sort select="string-length()" data-type="number" order="descending" />
<xsl:if test="position() = 1">
<xsl:value-of select="string-length(.)" />
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$knoten[string-length(.) = $max]" />
</xsl:if>
</xsl:template>
Dann rufst du diesen Template dort auf wo du es benötigst und gibts beim Aufruf die Knoten bekannt, von dem der Höchste ausgewählt werdensoll.
<xsl:call-template name="hoechste">
<xsl:with-param name="knoten" select="//name[parent::node[preceding-sibling::name[text() = 'Menüpunkt 2']]]" />
</xsl:call-template>
Auf dein XML-Angewendet:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/tree">
<html>
<head>
<title>Untitled</title>
</head>
<body>
<h1>
<xsl:call-template name="hoechste">
<xsl:with-param name="knoten" select="//name[parent::node[preceding-sibling::name[text() = 'Menüpunkt 2']]]" />
</xsl:call-template>
</h1>
</body>
</html>
</xsl:template>
<xsl:template name="hoechste">
<xsl:param name="knoten" />
<xsl:if test="$knoten and not($knoten[string-length(.) != string-length(.)])">
<xsl:variable name="max">
<xsl:for-each select="$knoten">
<xsl:sort select="string-length()" data-type="number" order="descending" />
<xsl:if test="position() = 1">
<xsl:value-of select="string-length(.)" />
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$knoten[string-length(.) = $max]" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Grüße
Thomas