首页 > 解决方案 > 跳过 xsl:for-each 迭代时 xsl:number 递增

问题描述

我有 XML 消息:

<DataList>
    <Datainfo>                  
        <Name>Doc_image.jpg</Name>              
        <Type>Image</Type>                                      
    </Datainfo>

    <Datainfo>                  
        <Name>Spec_text1.txt</Name>             
        <Type>Document</Type>                                           
    </Datainfo>

    <Datainfo>                  
        <Name>Spec_text2.txt</Name>             
        <Type>Document</Type>                                           
    </Datainfo>
</DataList>

应将其转换为具有 2 个要求的另一个 XML:

我的 XSL 是:

<xsl:template match="//*:DataList">
<xsl:for-each select="./*:Datainfo[./*:Type = 'Document']">
    <xsl:variable name="num">
        <xsl:number/>
    </xsl:variable>

    <xsl:if test="$num &lt;= 5">
        <xsl:element name="Name{$num}">
            <xsl:value-of select="./*:Name"/>
        </xsl:element>
    </xsl:if>
</xsl:for-each>
</xsl:template>

第一个带有类型 Image 的块被跳过,但计数器仍然考虑这个迭代并且无论如何都会递增!现在我明白了:

<Name2>Spec_text1.txt</Name2>
<Name3>Spec_text2.txt</Name3>

预期结果是:

<Name1>Spec_text1.txt</Name1>
<Name2>Spec_text2.txt</Name2>

我被困在这里,因为据我所知,我无法创建自己的计数器并随时增加/减少它,就像在 Java 中一样。任何帮助表示赞赏。

标签: javaxmlxsltsoap

解决方案


只需使用<xsl:for-each select="./*:Datainfo[./*:Type = 'Document'][position() le 5]"><xsl:element name="Name{position()}">


推荐阅读