xslt与Saxon合并功能

时间:2013-09-05 21:32:48

标签: xslt

有没有人知道在XSLT中执行合并的内置函数,还是我需要编写自己的函数?

我有一些像这样的xml:

<root>
 <Element1>
   <Territory>Worldwide</Territory>
   <Name>WorldwideName</Name>
   <Age>78</Age>
 </Element1>
 <Element1>
   <Territory>GB</Territory>
   <Name>GBName</Name>
 </Element1>
</root>

第二个元素1(GB Territory)是完全可选的,可能会或可能不会发生,但是当它确实发生时,它优先于WorldWide Territory。

所以我追求的是下面的合并:

<xsl:variable name="Worldwide" select="root/Element1[./TerritoryCode ='Worldwide']"/>
<xsl:variable name="GB" select="root/Element1[./TerritoryCode ='GB']"/>

<xsl:variable name="Name" select="ext:coalesce($GB/Name, $Worldwide/Name)"/>

id是上例中的变量Name将包含GBName。

我知道我可以使用xsl:choose,但我有一些地方有4个地方可以看,xsl:选择变得凌乱和复杂,所以希望找到一个内置函数,但没有运气到目前为止。

谢谢。

1 个答案:

答案 0 :(得分:6)

在XSLT 2.0中,您可以从变量中创建一系列项目,然后使用谓词过滤器选择第一个项目:

<xsl:variable name="Name" select="($GB/Name, $Worldwide/Name)[1]"/>

谓词过滤器将选择序列中的第一个非空项。

例如,这仍然会产生“GBName”:

<xsl:variable name="emptyVar" select="foo"/>
<xsl:variable name="Worldwide" select="root/Element1[Territory ='Worldwide']"/>
<xsl:variable name="GB" select="root/Element1[Territory ='GB']"/>

<xsl:variable name="Name" select="($emptyVar, $GB/Name, $Worldwide/Name)[1]"/>