获取XSL中的元素总数

时间:2017-01-27 11:10:02

标签: xml xslt

代码输出" url"每个"图像"每个网址后使用$ sep确定(超过8的限制)。

但我想设置一个条件,如果它找到例如4"图像"然后它将输出$ sep 4次(在每个之后用$ sep打印出4个url之后)。但是,当我尝试下面的代码时,它似乎没有计算图像/图像,因为计数总是1(无论有多少"图像"有)。

示例xml输入

<images>
  <image>
   <url>Url</url>
  </image>
  <image>
   <url>Url</url>
  </image>
  <image>
   <url>Url</url>
  </image>
  <image>
   <url>Url</url>
  </image>
</images>

XSL代码

<xsl:for-each select="images/image[position() &lt;= 8]">
    <xsl:value-of select="url"/>    <xsl:value-of select="$sep" />

</xsl:for-each>
    <xsl:variable name="set" select="images/image" />
    <xsl:variable name="count" select="count($set)" />

<xsl:choose>
    <xsl:when test="count='4'">
         <xsl:value-of select="$sep" />
         <xsl:value-of select="$sep" />
         <xsl:value-of select="$sep" />
         <xsl:value-of select="$sep" />
    </xsl:when>
</xsl:choose>

当前输出

URl,URl,URl,URl,

想要输出

URl,URl,URl,URl,,,,,

由于

1 个答案:

答案 0 :(得分:1)

检查$变量时,您错过了count符号。应该是这个......

<xsl:when test="$count=4">

(不需要4个左右的撇号,因为$ count是一个数字,尽管它仍然适用于XSLT 1.0)

编辑:考虑使用递归模板来处理XSLT中的任意数量的image元素。

试试这个..

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="text" />
    <xsl:variable name="sep" select="','" />

    <xsl:template match="/">
        <xsl:for-each select="images/image[position() &lt;= 8]">
            <xsl:value-of select="url"/>    <xsl:value-of select="$sep" />

        </xsl:for-each>

        <xsl:variable name="set" select="images/image" />
        <xsl:variable name="count" select="count($set)" />

        <xsl:call-template name="pad">
            <xsl:with-param name="count" select="$count" />
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="pad">
        <xsl:param name="count" />
        <xsl:if test="$count + 1 &lt; 8">
            <xsl:value-of select="$sep" />
            <xsl:call-template name="pad">
                <xsl:with-param name="count" select="$count + 1" />
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>