【问题标题】:how to count using for each in xsl如何在 xsl 中使用 for each
【发布时间】:2015-12-16 09:49:36
【问题描述】:

请看下面,示例 xml

<OuttypList>
   <Outtyp>
         <A>
            <P>0</P>
            <T>NoShare</T>
         </A>
   </Outtyp>
    <Outtyp>
        <Outtypform>Bank</Outtypform>
        <A>
            <A>
                <P>1000</P>
                <T>Share</T>
            </A>
            <S>100</S>
        </A>
        <B>         
            <C>3015</C>
            <D>James</D>
        </B>
    </Outtyp>
    <Outtyp>
    <Outtypform>Bank</Outtypform>
         <A>
            <P>10</P>
            <T>Share</T>
         </A>
   </Outtyp></OuttypList>

我正在显示 Outtyp 的详细信息,并且在显示每个 Outtyp 之后,我正在插入一个空格,以便数据看起来不错。

<xsl:for-each select="OuttypList/Outtyp">
<xsl:if test="normalize-space(Outtypform)">
--displaying details--
</xsl:if>
<xsl:choose>
        <xsl:when test="position() != last()">
              <tr>
                    <td colspan="2">
                          <span><text>&#160;</text></span>
                    </td>
              </tr>
        </xsl:when>
        <xsl:otherwise></xsl:otherwise>
</xsl:choose>

问题:现在使用此代码,它最初会创建我不想要的额外空间,所以如果 Outtyp 中不存在 Outtypform,我不想要额外的空间行。需要更改“每个”以便它应该计数Outtyp 仅基于 Outtypform 存在于 Outtyp 下。例如 - 上面的示例 xml 有 3 个 Outtyp 节点......但只有两个包含 所以每个 Outtyp 之后只应该显示两个带有详细信息的节点和额外的空间。

【问题讨论】:

  • 你能显示预期的输出吗?
  • "应仅在 Outtyp 下存在 Outtypform 时才计算 Outtyp" >> 虽然 xsl:number 可以做到这一点,但使用起来更容易,更可取谓词。事实上,每次你发现自己写了一个带有节点测试的xsl:if,你应该非常强烈地考虑将它放在选择谓词中。

标签: javascript html xml xslt foreach


【解决方案1】:

要么将 xsl:choose 块放在 xsl:if 块内,要么 - 最好 - 将您的选择更改为:

<xsl:for-each select="OuttypList/Outtyp[normalize-space(Outtypform)]">

那么你根本不需要xsl:if

未经测试,因为提供的代码不完整。

【讨论】:

  • @user3855942 如果您的问题得到解答,请通过接受答案来关闭它。
猜你喜欢
  • 2011-10-30
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2016-04-09
  • 2018-09-08
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多