我正在尝试使用XSLT将简单的XML架构转换为HTML,并计划使用fn:replace
将回复(\n
)替换为<p>;
。但是,我无法弄清楚如何正确使用此功能。
我正在使用的XSLT简化版读取:
<?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>
此XLST的输入是例如:
<?xml version="1.0"?>
<root>
<value><![CDATA[
Hello
world!
]]></value>
</root>
使用NoSuchMethodException在fn:replace
上转换失败。如果我将replace语句更改为
<xsl:value-of select="fn:replace('somestring', '\n', '<p>')" />
我收到IllegalArgumentException。如何使用fn:replace
来实现我想要的目标?
我正在使用Butterfly XML Editor来测试XSLT。
答案 0 :(得分:7)
XPath 2.0有一个替换函数,可以用于任何XSLT 2.0处理器,如Saxon 9或AltovaXML工具或Gestalt。您似乎尝试使用XSLT 1.0处理器的功能,这是行不通的。如果您被限制为XSLT 1.0处理器,则需要使用命名的递归模板或在扩展的帮助下实现替换。
但请注意,即使使用XSLT 2.0,您尝试使用replace似乎也是错误的,因为您将生成带有'p'标记标记的文本节点,而我假设您要在结果中创建'p'元素节点。因此,即使使用XSLT 2.0使用analyze-string而不是replace,也更有可能获得您想要的结果。
答案 1 :(得分:0)
将<xsl:stylesheet>
的版本属性提升为2.0并使用
<xsl:value-of select="replace(description, '\n', '<p/>')" disable-output-escaping="yes" />
我能够进行替换工作。