2013-09-05 11 views
5

Czy ktoś wie o wbudowanej funkcji do wykonywania koalescencji w XSLT, czy będę musiał napisać własną?xslt funkcja koalescencji z Saxonem

mam formacie XML, jak to:

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

Drugi element1 (GB terytorium) jest całkowicie opcjonalne i może, maynot występuje jednak, gdy ma nastąpić ma pierwszeństwo nad, światowego terytorium.

Więc co miałem po coś jak poniżej coalesce:

<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 jest, że nazwa zmiennej w powyższym przykładzie będzie zawierać GBName.

Wiem, że mógłbym użyć xsl: wybrać, ale mam kilka miejsc, gdzie są 4 miejsca, w których mógłby wyglądać i xsl: wybór staje się bałaganiarski i skomplikowany, więc miał nadzieję znaleźć wbudowaną funkcję, ale bez powodzenia do tej pory.

Dziękuję.

+0

xPath 2 podtrzymuje [wyrażenia warunkowe] (http://www.w3.org/TR/xpath20/#id-conditionals), który może pomóżcie to osiągnąć. –

Odpowiedz

5

W XSLT 2.0 można po prostu stworzyć sekwencję elementów z zmiennych, a następnie wybierz pierwszy z filtrem kwantyfikatorów:

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

Filtr orzeczenie będzie wybrać pierwszą niezerową element w sekwencji .

Na przykład, to wciąż wytwarzają "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]"/>