Die Verwendung von XPath-Funktion fn:replace von XSLT
Ich versuche, die Verwendung von XSLT-konvertieren ein einfaches XML-schema zu HTML und geplant, um fn:replace
zu ersetzen gibt (\n
) mit <p>;
. Allerdings kann ich nicht herausfinden, wie Sie diese Funktion richtig.
Ist eine vereinfachte version des XSLT-ich bin mit liest:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:template match="/root">
<html>
<body>
<!-- Replace \n with <p> -->
<xsl:value-of select="fn:replace(value, '\n', '<p>')" />
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Und der Eingang zu diesem XLST ist z.B.:
<?xml version="1.0"?>
<root>
<value><![CDATA[
Hello
world!
]]></value>
</root>
Die Konvertierung schlägt fehl, auf fn:replace
mit einer NoSuchMethodException. Wenn ich die replace-Anweisung, um
<xsl:value-of select="fn:replace('somestring', '\n', '<p>')" />
Bekomme ich eine IllegalArgumentException. Wie verwende ich fn:replace
zu erreichen, was ich will?
Ich bin mit Butterfly XML-Editor zum testen der XSLT -.
Du musst angemeldet sein, um einen Kommentar abzugeben.
XPath 2.0 hat eine ersetzen-Funktion, die Sie verwenden können mit XSLT 2.0-Prozessor wie Saxon 9 oder AltovaXML-tools oder Gestalt. Sie scheinen zu versuchen, um die Funktion zu verwenden, die mit einer XSLT 1.0-Prozessor, das ist nicht zur Arbeit gehen. In den Fall, Sie beschränken sich auf ein XSLT 1.0-Prozessor, den Sie benötigen, um zu implementieren, die den Austausch mit eine benannte rekursive Vorlage oder mit Hilfe einer Verlängerung.
Jedoch beachten, dass auch mit XSLT 2.0-der Versuch zu verwenden, ersetzen Sie falsch scheint, wie Sie erzeugt einen text-Knoten mit einem 'p' - tag-markup, während ich nehme an, Sie wollen ein 'p' - element-Knoten im Ergebnis. So auch mit XSLT 2.0 verwenden analyze-string nicht ersetzen wahrscheinlicher ist, Sie bekommen das Ergebnis Sie wollen.
Durch Stöße das version-Attribut des
<xsl:stylesheet>
auf 2.0 und mit<xsl:value-of select="replace(description, '\n', '<p/>')" disable-output-escaping="yes" />
Konnte ich machen, die Arbeit ersetzen.