xslt fn:替换不按预期工作

时间:2011-06-09 03:43:41

标签: xml xslt xslt-2.0 xslt-1.0

我正在尝试将字符串location替换为tocation,所以基本上这是我的代码:

<div id="{fn:replace('location','l','t')}">

但不是给我tocation而是给了我t?!

直播示例:转到http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog_ex1 在第二个textarea中输入此代码并点击按钮Edit and Click Me

<?xml version="2.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <div>
    <xsl:value-of select="fn:replace('location','l','t')"/>
  </div>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:3)

我无法重现报告的问题

当我使用Saxon 9.1.05和XQSharp执行此转换时:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <div id="{replace('location','l','t')}"/>
 </xsl:template>
</xsl:stylesheet>
任何XML文档(未使用)上的

,两种情况下的结果都是预期的,正确的

<div xmlns:xs="http://www.w3.org/2001/XMLSchema" id="tocation"/>

这意味着您使用的是不合规/错误的XSLT 2.0处理器

与供应商联系并提交错误。

如果您使用的是XSLT 1.0处理器,则需要编写一个递归命名模板来进行简单的泛型替换(不使用RegExes)。在“xslt”标签中有许多这样的好例子可以在类似问题的答案中找到。

您想要执行的具体更改可以更轻松地完成

<div id="{translate('location','l','t')}"/>