XSLT: String-Processing möglich?
-
Hi Leute,
stellt euch vor, ich habe in meinem XML-Dokument in einem Node den Wert "Object.Interface.Function" und möchte anhand dieses Wertes einen Node selektieren und zwar nach folgendem XPath-Ausdruck: "//[@name='Object']/descendant::[@name='Interface']/descendant::*[@name='Function']".
Ist es mit XSLT möglich den einen in den anderen String umzuwandeln, wenn:
- es sichergestellt ist, dass es genau 2 Punkte sind
- wenn die Anzahl der Punkte beliebig sein sollDanke für eure Antworten.
-
Entweder du kennst die Position der Punkte schon im Voraus, dann kannst du die XPath-Funktion substr verwenden. Oder du kennst sie nicht, dann musst du die EXSLT-Funktionen str:tokenize oder str:split verwenden - oder auf XSLT/XPath 2.0 hoffen.
-
Hi,
habe es jetzt mit Saxxon und XSLT 2.0 geschafft mir den XPath-Ausdruck zu basteln:
<xsl:function name="my-fn:createXPathFromQualifiedName"> <xsl:param name="qualifiedName"/> <xsl:variable name="xpath"> <xsl:for-each select="tokenize($qualifiedName, '\.')"> <xsl:choose> <xsl:when test="position()=1">//</xsl:when> <xsl:otherwise>/descendant::</xsl:otherwise> </xsl:choose> <xsl:text>*[@name=</xsl:text><xsl:value-of select="."/> <xsl:text>]</xsl:text> </xsl:for-each> </xsl:variable> <xsl:value-of select="generate-id($xpath)"></xsl:value-of> </xsl:function>
In der Variable xpath steht das drinne, was ich möchte, der Inhalt der Variable wird aber irgendwie nicht als XPath-Ausdruck verstanden sondern als normaler Text. Wie schaff ich es, dass ein value-of mir mit diesem String die Nodes zeigt die dem XPath-Ausdruck entsprechen?
-
bin jetzt etwas weiter:
<xsl:function name="my-fn:createXPathFromQualifiedName"> <xsl:param name="qualifiedName"/> <xsl:variable name="xpath"> <xsl:for-each select="tokenize($qualifiedName, '\.')"> <xsl:choose> <xsl:when test="position()=1">//</xsl:when> <xsl:otherwise>/descendant::</xsl:otherwise> </xsl:choose> <xsl:text>*[@name='</xsl:text> <xsl:value-of select="."/> <xsl:text>']</xsl:text> </xsl:for-each> </xsl:variable> <xsl:value-of select="$xpath"/> </xsl:function> ... <xsl:variable name="xpath" select="my-fn:createXPathFromQualifiedName($name)"/> <xsl:value-of select="generate-id(saxon:evaluate($xpath))"/>
Leider beschwert sich jetzt Saxxon mit einer neuen Fehlermeldung:
"A sequence of more than one item is not allowed as the first argument of generate-id() (<type/>, <section/>) "
AUch wenn ich den XPath-Ausdruck "von Hand" dort hineinschreibe wo jetzt $xpath steht, funktioniert es nicht so wie geünwscht.Hoffe da kennt sich jemand mit aus