代码之家  ›  专栏  ›  技术社区  ›  larsmoa

使用xpath函数fn:replace from xslt

  •  7
  • larsmoa  · 技术社区  · 14 年前

    我正在尝试使用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:替换 感觉不到。如果我把替换语句改为

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

    我得到一个IllegalArgumentException。我怎么用 FN:替换 实现我想要的?

    我在用 Butterfly XML Editor 测试XSLT。

    2 回复  |  直到 12 年前
        1
  •  7
  •   Martin Honnen    14 年前

    XPath2.0有一个替换函数,您可以将它与任何XSLT2.0处理器(如Saxon9、AltovaXML工具或格式塔)一起使用。您似乎试图将该函数与XSLT1.0处理器一起使用,但这不起作用。如果限制您使用XSLT1.0处理器,则需要使用命名的递归模板或借助扩展实现替换。

    但是请注意,即使使用XSLT2.0,您尝试使用replace似乎也是错误的,因为您将使用“p”标记标记生成一个文本节点,而我假设您希望在结果中创建一个“p”元素节点。因此,即使使用xslt 2.0,使用analyze字符串而不是replace,也更有可能获得所需的结果。

        2
  •  0
  •   larsmoa    12 年前

    通过碰撞的版本属性 <xsl:stylesheet> 到2.0并使用

    <xsl:value-of select="replace(description, '\n', '<p/>')" disable-output-escaping="yes" />

    我能让替换工作完成。