Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String XSLT字符串替代_String_Xslt - Fatal编程技术网

String XSLT字符串替代

String XSLT字符串替代,string,xslt,String,Xslt,在XSLT2.0中,是否有一种简单的方法来替换字符串中的命名占位符 我正在考虑类似Python的string.Template的东西,您可以在其中执行以下操作: d = dict(name='Joe', age='50') print Template("My name is $name and my age is $age").substitute(d) 关键是要将字符串外部化,以便可以轻松地对其进行更改。到目前为止,我发现的唯一方法是使用带参数的命名xsl:template,但这相当冗长。

在XSLT2.0中,是否有一种简单的方法来替换字符串中的命名占位符

我正在考虑类似Python的string.Template的东西,您可以在其中执行以下操作:

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

关键是要将字符串外部化,以便可以轻松地对其进行更改。到目前为止,我发现的唯一方法是使用带参数的命名xsl:template,但这相当冗长。有更简单的方法吗?

Python字符串模板的顺序上没有高级功能,但是您可以使用xsl:analyze string执行类似的操作,这将允许您一次处理一个字符串的正则表达式分析。如果希望重放是表驱动的,可以设置xsl:key来存储映射,并编写xsl:function来对任意字符串执行替换


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

我最终做了如下事情:

<!-- 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>

我的名字是{name},我的年龄是{age}
乔
50

我必须为替换名称使用属性,而不仅仅是传递具有不同名称的节点(例如Joe)。XPath(或者至少是我使用的处理器Saxon)似乎不允许像“$subs/regex group(1)”这样的动态表达式。但是它允许“$subs/sub[@key=regex group(1)]”

您的问题不清楚。您是否想要一种自动机制,可以在替换值表中查找形式为$name的标记,并用值替换$name?在特定的文本节点中?全局?我正在寻找我可以调用的东西,向它传递一个特定的字符串和一组参数。使用分析字符串是个好主意——请参阅我的解决方案,作为单独的答案发布。