循环通过xpath每次在xslt 2中获得正确的迭代

时间:2016-06-08 19:04:43

标签: xslt xpath xslt-2.0 saxon

我有一个条件,我需要至少循环一次,所以我有以下xsl代码。但是,这不起作用,因为它总是获得最后的迭代值。我如何调整它以使它在每个循环上获得正确的迭代?

 <xsl:variable name='count0'>
    <xsl:choose>
    <xsl:when test='count($_BoolCheck/BoolCheck[1]/CheckBoolType) = 0'>
      <xsl:value-of select="1"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select='count($_BoolCheck/BoolCheck[1]/CheckBoolType)'/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:variable>
<xsl:for-each select="1 to $count0">
  <xsl:variable name='_LoopVar_2_0' select='$_BoolCheck/BoolCheck[1]/CheckBoolType[position()=$count0]'/>
  <e>
    <xsl:attribute name="n">ValueIsTrue</xsl:attribute>
    <xsl:attribute name="m">f</xsl:attribute>
    <xsl:attribute name="d">f</xsl:attribute>
    <xsl:if test="(ctvf:isTrue($_LoopVar_2_0/CheckBoolType[1]))">
      <xsl:value-of select="&quot;Value True&quot;"/>
    </xsl:if>
  </e>
</xsl:for-each>

xml文件如下:

<BoolCheck>
<CheckBoolType>true</CheckBoolType>
<CheckBoolType>false</CheckBoolType>
<CheckBoolType>1</CheckBoolType>
<CheckBoolType>0</CheckBoolType>
<CheckBoolType>True</CheckBoolType>
<CheckBoolType>False</CheckBoolType>
<CheckBoolType>TRUE</CheckBoolType>
<CheckBoolType>FALSE</CheckBoolType>
</BoolCheck>

在这种情况下,我需要迭代CheckBoolType的每次迭代并生成相应数量的值。但是,在上面的例子中,如果没有CheckBoolType迭代,我仍然希望迭代进入至少一次for-each循环。我希望再澄清一点。

1 个答案:

答案 0 :(得分:0)

首先观察:$ count0的声明可以替换为

<xsl:variable name="temp" select="count($_BoolCheck/BoolCheck[1]/CheckBoolType)"/>
<xsl:variable name="count0" select="if ($temp=0) then 1 else $temp"/>

(对不起,如果这似乎无关紧要,但我调试代码的第一步总是简化它。它使错误更容易找到。)

执行此操作时,您可以安全地将谓词[position()=$count0]替换为[$count0],因为$ count0现在是整数而不是文档节点。 (更好的是,在as='xs:integer'声明中使用xsl:variable将其声明为整数。)

但请挂断,$count0是要处理的元素数量,因此CheckBoolType[$count]将始终选择最后一个元素。那肯定不是你想要的。

这会让我们看到代码中的另一个错误。变量$_LoopVar_2_0的值是名为CheckBoolType的元素节点。表达式$_LoopVar_2_0/CheckBoolType[1]正在寻找此元素的子元素,它们也被命名为CheckBoolType。没有这样的子节点,因此表达式选择一个空序列,因此布尔测试始终为false。

在这个阶段,我想向您展示一些正确的代码,以实现您想要的输出。不幸的是,您没有向我们展示所需的输出。我无法对(a)您的错误代码以及(b)您尝试实施的算法的散文描述进行反向工程。