我在尝试翻译的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;元素,该元素甚至不应该在组中。
如果有人能指出我出错的地方,或提供更好的解决方案,我们将不胜感激。
答案 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
处理h3
和table
元素,但没有h2
元素处理外部组。
如果您需要更多帮助,请考虑发布包含名称空间的小型但完整的样本,这样我们就可以通过不需要的输出重现问题。