2011-12-20 36 views
3

我要檢查,如果所有的孩子都有一個屬性集,如果是在FO添加1個元素:如果所有的孩子都有一個屬性

<row> 
    <entry attribute="true"></entry> 
    <entry attribute="true"></entry> 
    <entry attribute="true"></entry> 
</row> 

例;如果每個條目元素都具有attribute = true,則添加一個元素。

<xsl:template match="row"> 
    <fo:table-row> 
    <xsl:apply-template/> 
    </fo:table-row> 

    <xsl:if test=""><!-- What to write here? --> 
    <fo:table-row/> 
    </xsl:if> 
</xsl:template> 
+0

你可能有興趣在一個更短,更高效的解決方案:) – 2011-12-20 13:20:30

+0

在我的答案需要調整最初的表達,現在已經完成。 – 2011-12-20 13:35:13

回答

6
count(*[@attribute="true"]) = count(*) 
+0

它的工作,謝謝! – user1065283 2011-12-20 11:57:47

0

什麼弗朗西斯說,或者類似的東西

count(*[not(@attribute="true")]) 
+0

我喜歡這個,但是你不需要另一個'not()'嗎? 'not(count(* [not(@ attribute =「true」)]))' – 2011-12-20 10:26:08

+0

取決於你在檢查什麼:)我會用'= 0'而不是在這裏。畢竟'count'不完全是布爾值。 – 2011-12-20 10:39:09

+0

我想我會跟數字1一起去。謝謝你的回覆! – user1065283 2011-12-20 11:59:06

2

這可能是多一點點效率,因爲沒有所有屬性的計數是必要的和評估可以發現立即停止條件爲@attribute = 'true'的第一個子元素爲false()

<xsl:if test="not(*[not(@attribute = 'true')])"> 
    <fo:table-row/> 
    </xsl:if> 

說明

這是雙重否定規則的另一種應用:

for every $x some property-y is true 

等同於:

there isn't any $z in $x such that for $z property-y is not true 
2

或者如果你使用XPath 2.0並且你喜歡使你的代碼可讀性

<xsl:if test="every $a in * satisfies $a/@attribute='true'"> 
    <fo:table-row/> 
    </xsl:if> 
相關問題