我有一个条件,我需要至少循环一次,所以我有以下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=""Value True""/>
</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循环。我希望再澄清一点。
答案 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)您尝试实施的算法的散文描述进行反向工程。