我正在使用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
或者不在那个地方......
所以,请指导我摆脱这个问题......
答案 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内部。