【问题标题】:xsl:number increments when xsl:for-each iteration is skipped跳过 xsl:for-each 迭代时 xsl:number 递增
【发布时间】:2020-10-26 13:44:56
【问题描述】:

我有 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:

  • 只有那些 Type = 'Document' 的 &lt;Datainfo&gt; 块。
  • 总共不超过 5 个块。 (为此,我使用 xsl:number 作为计数器)

我的 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 类型的块被跳过了,但是 counter 仍然考虑这个迭代并且无论如何都会递增!现在我明白了:

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

预期结果是:

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

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

【问题讨论】:

    标签: java xml xslt soap


    【解决方案1】:

    只需使用&lt;xsl:for-each select="./*:Datainfo[./*:Type = 'Document'][position() le 5]"&gt; 和&lt;xsl:element name="Name{position()}"&gt;。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2016-07-13
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多