2013-09-05 2 views
5

Кто-нибудь знает о встроенной функции для выполнения coalesce в XSLT, или мне нужно написать свое собственное?xslt coalesce function with Saxon

У меня есть некоторые XML следующим образом:

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

Второй element1 (GB край) является необязательным и укомплектовать может или возникнуть, могут не, однако, когда это происходит, то оно имеет приоритет над WorldWide на территории.

Так что я был после что-то вроде ниже сливаются:

<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)"/> 

Идентификатор в том, что имя переменной в приведенном выше примере будет содержать GBName.

Я знаю, что могу использовать xsl: choose, но у меня есть места, где есть 4 места, которые он мог бы посмотреть, а xsl: выбрать просто становится грязным и сложным, поэтому надеялся найти встроенную функцию, но пока не повезло.

спасибо.

+0

XPath 2 поддерживает условные выражения [] (http://www.w3.org/TR/xpath20/#id-conditionals), который может помогите вам достичь этого. –

ответ

5

В 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]"/> 
Смежные вопросы