2013-09-05 3 views
5

XSLT'de bir birleştirme gerçekleştirmek için yerleşik bir işlevden herhangi biri var mı, yoksa kendi yazmam gerekecek mi? buna Alim Territory önceliklidir meydana ancak ne zamanxslt coalesce işlevi ile Saxon

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

ikinci element1 (GB bölgesi) tamamen isteğe bağlıdır ve ya meydana maynot edilebilir:

böyle bazı xml var.

Yani ne sonra oldu aşağıdaki COALESCE gibi bir şey:

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

yukarıdaki örnekte değişken Adı GBName içerecek olan kimliği.

xsl: select'i kullanabileceğimi biliyorum, ama bakabileceğim 4 yer var ve xsl: sadece karmaşık ve karmaşık bir seçim yap, bu yüzden yerleşik bir işlev bulmayı umuyordum ama Şimdiye kadar şans yok.

Teşekkür ederiz.

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

yüklem filtre dizisindeki ilk boş olmayan öğe seçecektir: Eğer sadece değişkenlerden öğelerin bir diziyi oluşturmak ve daha sonra bir yüklem filtreli ilk birini seçmek olabilir XSLT 2.0

+0

XPATH 2 destekleri [koşullu ifadeler] (http://www.w3.org/TR/xpath20/#id-conditionals) ki bunlar Bunu başarmana yardım et. –

cevap

5

.

Örneğin, bu yine de "GBName" üretecektir:

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