Если у всех детей есть атрибут - PullRequest
3 голосов
/ 20 декабря 2011

Я хочу проверить, все ли дочерние элементы имеют установленный атрибут, и если да, добавить еще 1 элемент в fo:

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

Пример; если у каждого элемента записи есть атрибут = 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>

Ответы [ 4 ]

6 голосов
/ 20 декабря 2011
count(*[@attribute="true"]) = count(*)
2 голосов
/ 20 декабря 2011

Или, если вы используете XPath 2.0, и вы хотите, чтобы ваш код читался

  <xsl:if test="every $a in * satisfies $a/@attribute='true'">
    <fo:table-row/> 
  </xsl:if>
2 голосов
/ 20 декабря 2011

Это могло бы быть немного более эффективным, потому что подсчет всех атрибутов не требуется , и оценка может быть немедленно остановлена ​​при поиске первого дочернего элемента, для которого условие @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
0 голосов
/ 20 декабря 2011

Что говорит Фрэнсис или что-то вроде

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