使用XPath函数fn:从XSLT替换

时间:2010-02-02 12:23:30

标签: xml xslt xpath

我正在尝试使用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。

2 个答案:

答案 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" />

我能够进行替换工作。