如果所有孩子都有属性

时间:2011-12-20 10:05:38

标签: xml xslt xpath xsl-fo

我想检查所有孩子是否都设置了属性,如果是,请在fo中添加1个元素:

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

实施例;如果每个entry元素都有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>

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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 :(得分:2)

或者,如果您使用的是XPath 2.0,并且希望使代码可读

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

答案 3 :(得分:0)

弗朗西斯说什么或类似的东西

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