是否可以在XSLT中使用sprintf()函数?

时间:2010-08-18 08:58:24

标签: xslt printf

我想做“Hello%s”之类的事情,并在另一个变量中使用“World”。

当然我可以使用字符串替换来完成这个简单的情况,但是如果可能的话,我希望所有的sprintf()功能都像参数重新排序一样,这对我自己来说非常复杂。

2 个答案:

答案 0 :(得分:2)

Hello World的XML / XSLT等价物是

我们有这个XML文档:

<t>Hello <rep/>!</t>

并在其上使用此转换

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

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="rep">
  <xsl:value-of select="'World'"/>
 </xsl:template>
</xsl:stylesheet>

生成了想要的结果

<t>Hello World!</t>

请注意

  1. 我们使用并覆盖身份规则。这是最基本的XSLT设计模式。

  2. 我们可以散布具有许多不同替换元素的常量内容,因此具有“填空”技术

  3. 使用此技术可以实现内容和处理逻辑之间的完全分离。 XSLT代码不知道它正在处理什么源XML文档(文档URL甚至可以作为参数传递)。可以使用相同的XSLT样式表填充空白文档,任何填充空白文档都可以由不同的XSLT样式表处理。这种分离实现了最大的灵活性和可维护性。

  4. 如果您只想生成文本,也可以轻松完成 - 例如使用<xsl:output method="text"/>

答案 1 :(得分:1)

如果您在支持使用扩展对象(例如.NET语言或PHP之一)扩展XSLT的语言中执行转换;然后你可以简单地创建一个函数来执行此操作并从XSLT中调用它。