如何在xslt 2.0中获得下一个当前处理元素的后续兄弟?

时间:2012-07-31 05:36:12

标签: xml xslt xpath xslt-2.0 xpath-2.0

我正在使用xslt 2.0将一个xml文件转换为另一个xml文件。在XSLT 2.0中,我创建了一个带有一个参数的函数。实际上,参数是<w:p>个元素的集合。所以,在函数我使用<xsl:for-each-group>来获取每个<w:p>并逐个处理。假设,下面提到的XML文件包含一个<w:table&gt; <w:p>元素之间的元素。所以,现在我想在处理following-sibling::w:table块中的每个<w:p>元素后检查函数中的<xsl:for-each-group>

XML文件

 <w:document>
      <w:p> para0</w:p>
      <w:p> para1</w:p>
      <w:table>table</w:table>
      <w:p>para3</w:p>
</w:document>

XSLT代码段:

<xsl:for-each-group select="$paragraphs" group-starting-with="w:p">           
                <xsl:apply-templates select="current-group()"> <!-- for processing <w:p>elements -->
                </xsl:apply-templates>         

                <xsl:if test="following-sibling::w:table"> <!--check following-sibling of current <w:p> is <w:table> -->
                        <xsl:apply-templates select="following-sibling::w:table">    </xsl:apply-templates>
                    </xsl:if>    
    </xsl:for-each-group>    

但是当第一个元素被处理时,following-sibling::w:table的检查被调用。我将仅在第二个元素被处理时调用。所以,我想只检查当前处理元素的下一个立即following-sibling或者不在那个地方......

所以,请指导我摆脱这个问题......

1 个答案:

答案 0 :(得分:0)

在xsl:for-each-group中,上下文项是当前组中的第一项。因此,follow-sibling将相对于组中的第一个项目进行选择。如果要选择相对于第二个项目,请使用current-group()[2] / following-sibling :: x。 (另外你可能只想要第一个跟随兄弟,这将是跟随兄弟:: x [1])。

但是你谈到了当前的处理元素&#34;这是你自己发明的术语。您想要处理组中每个项目的以下兄弟姐妹吗?在那种情况下,我希望看到一个xsl:for-each select =&#34; current-group()&#34;在xsl:for-each-group内部。