2009-09-22 116 views
0

在XSLT 2.0中,是否有一种简单的方法来替换字符串中的指定占位符?XSLT字符串替换

我想的有点像Python的string.Template,在这里你可以这样做:

d = dict(name='Joe', age='50') 
print Template("My name is $name and my age is $age").substitute(d) 

点是外部的字符串,因此它可以很容易地改变。到目前为止,我发现的唯一方法是使用带参数的命名xsl:模板,但这非常冗长。有更容易的方法吗?

+0

你的问题不清楚。你是否想要一个自动化机制,以替换值表的形式查找标记,例如$ name,查找“name”,并用值替换$ name?在特定的文本节点?在全球范围内? – 2009-09-22 21:07:59

+0

我正在寻找可以调用的东西,并将其传递给特定的字符串和一组参数。 – 2009-09-22 21:50:16

回答

1

最后我做这样的事情:

<!-- Reusable template to perform substitutions on a string --> 
<xsl:template name="substitutions"> 
    <!-- "string" is a string with placeholders surrounded by {} --> 
    <xsl:param name="string" /> 
    <!-- "subs" is a list of nodes whose "key" attributes are the placeholders --> 
    <xsl:param name="subs" /> 
    <xsl:analyze-string select="$string" regex="\{{(.*?)\}}"> 
     <xsl:matching-substring> 
      <xsl:value-of select="$subs/sub[@key=regex-group(1)]" /> 
     </xsl:matching-substring> 
     <xsl:non-matching-substring> 
      <xsl:value-of select="." /> 
     </xsl:non-matching-substring> 
    </xsl:analyze-string> 
</xsl:template> 

<!-- Example use of template --> 
<xsl:variable name="nameStr">My name is {name} and my age is {age}</xsl:variable> 
<xsl:call-template name="substitutions"> 
    <xsl:with-param name="string" select="$nameStr" /> 
    <xsl:with-param name="subs"> 
     <sub key="name">Joe</sub> 
     <sub key="age">50</sub> 
    </xsl:with-param> 
</xsl:call-template> 

我不得不使用属性的替代名称,而不是仅仅通过节点以不同的名称(例如<名>乔< /名称>)。 XPath(或者至少Saxon,我正在使用的处理器)似乎不允许像“$ subs/regex-group(1)”这样的动态表达式。但它确实允许“$ subs/sub [@key = regex-group(1)]”。

1

没有的Python字符串模板级的高层次功能,但你可以使用XSL做同样的事情:分析串,你可以同时处理这将让一个字符串的正则表达式分析一块。如果您希望替换为表驱动,您可以设置一个xsl:键来存储映射,然后编写一个xsl:函数来对任意字符串执行替换。

不是世界上最简单的事情,但如果做得正确的话,它肯定是可行和可重用的。

+0

使用analyze-string的好主意 - 查看我的解决方案,发布为单独的答案。 – 2009-09-22 23:10:39