XSLT current-groups()问题

时间:2013-07-03 15:52:43

标签: xslt-2.0 xslt-grouping

我在尝试翻译的HTML文件时遇到了一些麻烦。基本上,目前源结构的相关部分是:

<h2 />
<h3 />
<table />
<table />
<h3 />
<table />
<table />
<h3 />
<table />
<h3 />
<h3 />
<table />
<table />
<h2 />
<h3 />
...

等等。这些内容的每个内容都以不同的方式进行翻译,但我目前遇到的问题是将它们正确分组。基本上,我希望它最终如下:

<category>
    <h2 />
    <container>
        <h3 />
        <table />
        <table />
    </container>
    <container>
        <h3 />
        <table />
        <table />
    </container>
    <container>
        <h3 />
        <table />
    </container>
    <container>
        <h3 />
    </container>
    <container>    
        <h3 />
        <table />
        <table />
    </container>
</category>
<category>
    <h2 />
    <container>
        <h3 />
        ...

为实现这一目标,我一直在使用以下代码:

<xsl:for-each-group select="node()"group-starting-with="xh:h2">
    <category>
        <xsl:apply-templates select="xh:h2"/>
        <xsl:for-each-group select="current-group()" 
                    group-starting-with="xh:h3">
            <container>
                <xsl:apply-templates select="current-group()[node()]"/>
            </container>
        </xsl:for-each-group>
    </category>
</xsl:for-each-group>

但是,我得到的输出如下:

<category>
    <h2 />
    <container>
        <h3 />
        <table />
        <table />
        <h3 />
        <table />
        <table />
        <h3 />
        <table />
        <h3 />   
        <h3 />
        <table />
        <table />
    </container>
</category>
<category>
    <h2 />
    <container>
        <h3 />
        ...

第一个for循环函数按预期工作,但第二个似乎不是。如果我使用<xsl:copy-of&gt;输出<current-group&gt;中的第一个元素在第二个for循环中,它显示<h2&gt;元素,该元素甚至不应该在组中。

如果有人能指出我出错的地方,或提供更好的解决方案,我们将不胜感激。

2 个答案:

答案 0 :(得分:0)

我认为你已经简化了问题,并且这样做引入了一些红色鲱鱼。

xsl:apply-templates select="h2"肯定无效,因为在外部分组中选择的节点都没有h2子节点。

在外部for-each-group选择的每个组中,除第一个外,根据定义,组中的第一个节点将是h2元素。你的内部for-each-group会将以h2开头的节点序列划分为:first,一个以h2开头的组(因为每个节点都成为某个组的一部分),然后是一系列组,每个组都以一个h3。您需要拆分第一个(非h3)组并对其进行不同的处理,因为在这种情况下您不希望生成container元素。所以你需要一个xsl:在内部for-each-group中选择,通常使用条件xsl:when test="self::h2"来检测你正在处理特殊的第一组。

说完所有我无法理解为什么你没有为每个h3元素获得container元素。我认为这必定是由你没有向我们展示的东西引起的(可能是名称空间问题?)

答案 1 :(得分:0)

我想你要改变

<xsl:for-each-group select="node()" group-starting-with="xh:h2">
    <category>
        <xsl:apply-templates select="xh:h2"/>
        <xsl:for-each-group select="current-group()" 
                    group-starting-with="xh:h3">

<xsl:for-each-group select="*" group-starting-with="xh:h2">
    <category>
        <xsl:apply-templates select="."/>
        <xsl:for-each-group select="current-group() except ." 
                    group-starting-with="xh:h3">

这样内部for-each-group处理h3table元素,但没有h2元素处理外部组。

如果您需要更多帮助,请考虑发布包含名称空间的小型但完整的样本,这样我们就可以通过不需要的输出重现问题。