【问题标题】:Using XPath function fn:replace from XSLT使用 XPath 函数 fn:replace 从 XSLT
【发布时间】:2010-02-02 12:23:29
【问题描述】:

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

fn:replace 上的转换失败并出现 NoSuchMethodException。如果我将替换语句更改为

<xsl:value-of select="fn:replace('somestring', '\n', '<p>')" />

我得到一个 IllegalArgumentException。如何使用fn:replace 来实现我想要的?

我正在使用Butterfly XML Editor 来测试 XSLT。

【问题讨论】:

    标签: xml xslt xpath


    【解决方案1】:

    XPath 2.0 有一个替换功能,您可以将它与任何 XSLT 2.0 处理器(如 Saxon 9 或 AltovaXML 工具或 Gestalt)一起使用。您似乎尝试将该功能与 XSLT 1.0 处理器一起使用,但这是行不通的。如果您受限于 XSLT 1.0 处理器,则需要使用命名递归模板或借助扩展来实现替换。

    但是请注意,即使使用 XSLT 2.0,您使用替换的尝试似乎也是错误的,因为您将生成一个带有“p”标记标记的文本节点,而我假设您想在结果中创建一个“p”元素节点。因此,即使在 XSLT 2.0 中使用分析字符串而不是替换,也更有可能获得您想要的结果。

    【讨论】:

    • 谢谢,提到 XSLT 2.0 将我推向了正确的方向。通过增加 的版本属性;到 2.0 并使用 ;我完成工作。也许分析字符串更干净,但这可以完成工作:)
    • 除了将版本升级到 2.0 之外,您还做过什么吗?
    • 你能告诉我如何将 的版本属性提高到 2.0 吗?
    【解决方案2】:

    通过将&lt;xsl:stylesheet&gt; 的版本属性设置为2.0 并使用

    &lt;xsl:value-of select="replace(description, '\n', '&lt;p/&gt;')" disable-output-escaping="yes" /&gt;

    我能够使替换工作。

    【讨论】:

    • 你能告诉我如何将 的版本属性提高到 2.0 吗?
    • @JatinPatel:&lt;xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions"&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2012-01-20
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    相关资源
    最近更新 更多