2012-03-01 21 views
3

現在、この構造体を使用して、指定されたXML文書にノードが存在しない場合にデフォルト値を割り当てています。同じことを述べるより簡潔な方法がありますか?ノードが存在しない場合のデフォルト値の適用

+0

これは未検証の提案ですが、私はXPathセレクターが "or"を理解していると推測します: ' – kernel

+0

うまくいきません。 var_nameの値ではなくtrueを返します。 – rophl

答えて

2
<xsl:choose> 
    <xsl:when test="var_name"><xsl:value-of select="var_name"/></xsl:when> 
    <xsl:otherwise>default</xsl:otherwise> 
</xsl:choose> 

I. XPath 2.0の

使用

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="yourVar" select="'something'"/> 
<xsl:variable name="yourVar2" select="''"/> 

<xsl:template match="/"> 
    <xsl:sequence select="concat($yourVar, 'default'[not($yourVar)])"/> 
    <xsl:text>&#xA;</xsl:text> 
    <xsl:sequence select="concat($yourVar2, 'default'[not($yourVar2)])"/> 
</xsl:template> 
</xsl:stylesheet> 
:ここ

concat($yourVar, 'default'[not($yourVar)]) 

が完了XSLT 2.0変換ありますこの変換は、(使用されない)任意のXML文書に適用される場合、所望の文字列が生成され、両方の変数ために出力される。

something 
default 

II。 XPath 1.0の

使用

concat($yourNodeExpr, 
     substring('default', 1 + 7*boolean($yourNodeExpr))) 

それは少なくとも1つのノードが含まれている場合、これはそれ以外の場合は、文字列"default"を生成し、$yourNodeExprの文字列値を作成します。

説明number(false()) = 0number(true()) = 1:ブール値は、算術演算子のオペランドであるときはいつでものXPath 1.0で

は、この値を数値に変換される:

我々は、事実を使用。したがって、boolean($yourNodeExpr)true()である場合、2番目の引数はsubstring above will become 1 + 7 = 8`になり、部分文字列は空の文字列になります。他方の側で

boolean($yourNodeExpr)false()substring()に2番目の引数が1+0 = 1であり、サブストリング"default"

Aより一般的な表現ある場合:と仮定

concat(substring($val1, 1 div $cond1), 
     substring($val1, 1 div $cond2) 
     ) 

2つの条件$cond1および$cond2は、であり、互いに排他的である。($cond1 and $cond2) = false()および($cond1 or $cond2) = true()$cond1true()の場合、上記の式は文字列$val1を生成し、$cond2true()の場合は$val2という文字列を生成します。

+0

このソリューションは機能しますが、直感的ではありません。正直言って、私は基本的にbash変数の代入に相当するものを探していました。 '$ {parameter-default}' – rophl

+0

@rohl:直感的な解決策が必要な場合は、XPath 2.0以降を使用してください。 –

+0

@rohl:この回答に追加したXPath 2.0の表現は、おそらくあなたの後ろのものです。 –

関連する問題