6

有谁知道在 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 领土)是完全可选的,可能会出现也可能不会出现,但是当它确实出现时,它优先于 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 将包含 GBName。

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

谢谢你。

4

1 回答 1

8

在 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]"/>
于 2013-09-06T02:15:59.943 回答