2012-01-12 13 views
8

このJavaプログラムでは、ブール値を出力文字列にマップするために、(trueの場合は「*」、falseの場合は空文字列)を使用します。XSLT 1.0 3進数の場合のイディオムif?

public class ternary { 
    public static void main(String[] args) { 
    boolean flags[]={true,false,true}; 
    for (boolean f : flags) { 
     System.out.println(f?"*":""); 
    } 
    } 
} 

出力は*、[空]、*です。

は、私のような、何かを入力XML文書を持っている:

<?xml version="1.0" ?> 
<?xml-stylesheet type="text/xsl" href="change.xsl"?> 
<root> 
    <change flag="true"/> 
    <change flag="false"/> 
    <change flag="true"/> 
</root> 

そして、私が '*' に真の '' に偽マッピングし、次のXSLTテンプレートを持っている(それが動作します):

<xsl:template match="change"> 
    <xsl:variable name="flag" select="translate(substring(@flag,1,1),'tf','*')"/> 
    <xsl:value-of select="$flag"/> 
</xsl:template> 

もっと簡潔なバージョンがありますか?

a)文字列 'true | false'からブール値true | falseを自動的に取得できますか? b)ブール値true | falseを '*'、 ''にマップする(xpath?)構文はありますか?

+0

似たような質問:http://stackoverflow.com/questions/971067/is-there-an-if-then-else-statement-in-xpath – Vadzim

答えて

8

A)私は、自動的にブール値trueを得ることができます| '|偽true' に から直接偽の文字列を?

b)boolean true | falseを '*'、 ''にマップする(xpath?)構文がありますか?

これは実際にはXPathの質問です。

I. XPath 1.0の

つ以上のXPath式指名手配結果生成するの評価があります。これはまた、b)の回答

substring('*', 2 -(@flag = 'true')) 

- 気づかはその文字列'true''false'はブール値ではありません。 2つのブール値はtrue()false()で、文字列ではありません。

上記の式では、XPath 1.0では、ブール値が必要なコンテキストにある場合、自動的にnumberに変換されます。定義により:

number(true())1

number(false())ある従って0

substring()

上記の呼び出しの第2引数である:1@flag = 'true'として評価さ

2 - (@flag = 'true') 

とそれ以外の場合は2になります。 $val"x"で、$val場合、文字列$s2を生成する場合、文字列$s1を生成

より一般的なXPath 1.0の式が"y"です:

concat(substring($s1, 1 div ($val = "x")), 
     substring($s2, 1 div ($val = "y")) 
    ) 

とき$val = "x"、文字列$s2とき、これは、文字列$s1を生成します$val = "y"、および空の文字列 - これらの2つの条件のいずれも成立しない場合

上記XPath 1.0の式は、$2、N個の異なる文字列が$s1を結果生じるように一般化することができる...、$sN機能concat()を持つことができるので、$val、値$v1の一つ、$v2、...、$vNある正確場合任意の数の引数


II。 XPathの2.0(XSLT 2.0)

'*'[current()/@flag = 'true'] 

より一般的には、2つの* N原子値$s1$s2、... $sN$v1$v2、...、$vN、全て$vi値が異なるように与えられましたこのXPath 2.0の式の評価結果は:

($s1, $s2, ..., $sN)[index-of(($v1, $v2, ..., $vN), $v)] 

$sKまさに$v eq $vKです。

+0

これは多くのおかげで - なぜ '2-x'と ' 1-x 'ですか? – monojohnny

+0

@monojohnny:良い質問です。 '2-x'の理由は1または2を取得するためです.Xpathのインデックスは1ベースであり、0ベースではありません。 –

+0

ああ、私は忘れてしまったのは、XSL文字列が1つしかないということです!乾杯!理にかなっている。 – monojohnny

1

テンプレートでは、単純なパターンマッチングを利用できます。

<xsl:template match="change[@flag = 'true']"> 

<xsl:template match="change"> 

ので、最初のものはエントリにマッチし、もう一方があなたのケースでは、次のスタイルシート

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" indent="yes"/> 

    <xsl:template match="change[@flag = 'true']"> 
     <xsl:text>*&#13;</xsl:text> 
    </xsl:template> 

    <xsl:template match="change"> 
     <xsl:text>&#13;</xsl:text> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:template> 
</xsl:stylesheet> 
与えられた、だから

している他のすべてのケースを(一致します

サンプルXMLに適用すると、以下が出力されます

* 

*