2012-01-12 111 views
8

這個Java程序使用三元的,如果,以布爾值映射到輸出字符串:(一個「*」爲真,假空字符串)。XSLT 1.0 Idiom for ternary如果?

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> 

這是否有更簡潔的版本?

一)我可以自動獲得布爾真值|直接從字符串「|假真」假? b)是否有一個(xpath?)結構將布爾值true | false映射到'*',''?

+0

相似的問題:http://stackoverflow.com/questions/971067/is-there-an-if-then-else-statement-in-xpath – Vadzim 2014-09-11 07:08:49

回答

8

a)我可以直接從 字符串'true | false'自動獲得boolean true | false的值嗎?

b)是否有一個(xpath?)構造將布爾值true | false映射到 '*',''?

這實際上是一個XPath問題

一的XPath 1.0

有超過一個XPath表達式,其中產生通緝的結果評價:

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

這也回答二) - 注意到'true''false'不是布爾值!唯一的兩個布爾值是true()false(),它們不是字符串。

在我們使用的事實,即在XPath 1.0中,如果一個布爾是在需要的號碼的情況下,它被自動轉換爲數字上述表達式。由定義:

number(true())1

number(false())0

因此該呼叫的第二個參數substring()以上:

2 - (@flag = 'true') 

評價爲1@flag = 'true'和到2否則。

的更一般的XPath 1.0產生該字符串$s1如果$val"x"併產生在字符串$s2如果$val表達式爲"y"

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

這產生了串$s1$val = "x",字符串$s2$val = "y"和空字符串 - 如果這兩個條件都不成立。

以上的XPath 1.0表達式可以推廣以產生N個不同的字符串導致$s1$2,...,$sN什麼時候$val是值之一$v1$v2,...,$vN因爲函數concat()可以具有任何數量的參數。


二,的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 2012-01-13 21:56:32

+0

@monojohnny:好問題。 '2-x'的原因是得到1或2. XPaths索引是基於1的,而不是基於0的。 – 2012-01-13 23:54:37

+0

啊是的,我忘了XSL字符串是1綁定的!乾杯!說得通。 – monojohnny 2012-01-15 11:34:23

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時,輸出如下:

* 

*