如何在xsl:for-each中仅显示一次文本

时间:2015-06-11 12:48:30

标签: xml xslt

我有一个带有“Drivers”节点的XML,它可以有多个“Driver”节点作为子节点。 (/马达/驱动器/驱动器) 每个“驱动程序”都有一个子节点“事故”,其值可以是Y或N.

现在我有了一个xsl,可以使用Apache FOP将这个xml转换为PDF。 我有一个要求:如果任何“Driver”节点有Accident =“Y”,我想显示一个文本。即使有多个“Driver”节点的Accident =“Y”,我希望文本只出现一次。

如果我正在写一个xsl:for-each循环来遍历Driver节点并检查事故值,那么每次Accident = Y时都会出现文本。但是如果任何驱动程序的事故= Y,我希望文本只出现一次。

如果没有中断功能或更改变量功能的值,我该怎么做?

在运行时,xml可以在Drivers中包含任意数量的Driver节点。

<Motor>
  <Drivers>
    <Driver>
      <Accident>
        <Value>Y</Value>
      </Accident>
    </Driver>
    <Driver>
      <Accident>
        <Value>Y</Value>
      </Accident>
    </Driver>
    <Driver>
      <Accident>
        <Value>N</Value>
      </Accident>
    </Driver>
    <Driver>
      <Accident>
        <Value>Y</Value>
      </Accident>
    </Driver>
  </Drivers>
</Motor>

来自当前XSL文件的快照:

<xsl:template name="DriverScedule">
<fo:block>
Some Block of existing text
</fo:block>
---Now I have to display another noew block of test here based on the condition---
</xsl:template>

2 个答案:

答案 0 :(得分:0)

xsl:if似乎更适合此任务,而不是xsl:for-each,例如:

<xsl:if test="//Driver/Accident/Value='Y'">
<!--`if test pass, print text "Foo" -->
    Foo
</xsl:if>

答案 1 :(得分:0)

这是XML:

<?xml version="1.0" encoding="UTF-8"?>
    <Policy>
      <Risks>
        <Risk>
            <Motor>
                <Vehicle>
                    <VehicleCondition>
                        <HasProblemsMakingItUnsafe>
                            <Value>true</Value>
                        </HasProblemsMakingItUnsafe>
                    </VehicleCondition>
                </Vehicle>
            </Motor>
        </Risk>
        <Risk>
            <Motor>
                <Vehicle>
                    <VehicleCondition>
                        <HasProblemsMakingItUnsafe>
                            <Value>true</Value>
                        </HasProblemsMakingItUnsafe>
                    </VehicleCondition>
                </Vehicle>
            </Motor>
        </Risk>
        <Risk>
            <Motor>
                <Vehicle>
                    <VehicleCondition>
                        <HasProblemsMakingItUnsafe>
                            <Value>false</Value>
                        </HasProblemsMakingItUnsafe>
                    </VehicleCondition>
                </Vehicle>
            </Motor>
        </Risk>
      </Risks>
    </Policy>

我在XSLT下面使用过:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>

<xsl:if test="(/Policy/Risks/Risk/Motor/Vehicle/VehicleCondition/HasProblemsMakingItUnsafe/Value='false')">
<p>Hello</p>
</xsl:if>

  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

输出为:

Hello

所以xsl:如果实际在节点内迭代以检查是否有任何节点满足条件。