如果有多个节点,如何在 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
。
我在 ;
分隔字符串中输出每个 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 中工作?
我可以求助于 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
。