如果有多个节点,如何在 value-of 指令中应用 concat(...)?

How can you apply concat(...) in a value-of directive in case of multiple nodes?

我在 ; 分隔字符串中输出每个 property 节点的 name 节点,如下所示:

<xsl:value-of select="properties/property/name" separator=";" />

我想对此进行更改,使每个元素都带有前缀 _。示例输出应为:

_alpha;_beta;_gamma

我尝试了以下方法:

<xsl:value-of select="concat('_', properties/property/name)" separator=";" />

我想用它来创建一个包含该字符串的输出节点:

<my_node>
    <xsl:value-of select="concat('_', properties/property/name)" separator=";" />
</my_node>

当有多个属性时,这会出错:

XPTY0004: A sequence of more than one item is not allowed
          as the second argument of fn:concat() (<name>, <name>)

有没有办法让它在 XSLT 2.0/3.0 中工作?

我可以求助于 中给出的 XSLT 1.0 for-each 解决方案(我们在其中手动添加分隔符),但我想知道 XSLT 2.0/3.0 中是否有一些优雅的东西是可能。

答案是肯定的。 XSLT 2.0 允许您编写这样的表达式...

<xsl:value-of select="properties/property/concat('_', name)" separator=";" />

因此,对于每个 property,它选择“_”与 name 元素的串联。

虽然这种语法在 XSLT 1.0 中无效。

在 XSLT 3.0 中,我倾向于将其写为

<xsl:value-of select="properties/property ! ('_' || name)" separator=";" />

并且可能使用 string-join() 而不是 xsl:value-of。您没有显示上下文,但仅当您确实需要文本节点而不是仅需要字符串时才尝试使用 xsl:value-of