我在这里什么都没走。我想将相邻的w:p
元素分组。否则,不应再更改文档。在第一个XSLT转换中,我进行身份转换,在其中使用for-each-group
和group-adjacent
创建组。但是兄弟元素(w:tbl
,w:bdr
)被删除了,这是我不想要的。
如何创建组而不删除同级元素?
我已经尝试了几种方法:将wx:sub-section
元素包含在另一层中,其中将w:p
元素包含在另一层中–将它们与for-each-group
模板匹配中的同级元素分开。没有成功。对我有所帮助的是使用for-each-group
(然后也group-adjacent
)的模板匹配来搜索几种模式。最后,文档的某些部分始终被删除。
我的源XML(简体)
<wx:sect>
<w:p val='1'>...</w:p>
<w:p val='1'>...</w:p>
<wx:sub-section>
<w:p val='1'>...</w:p>
<w:p val='1'>...</w:p>
<w:tbl>...<w:tbl>
<w:bdr>...</w:bdr>
<w:p val='2'>...</w:p>
<w:p val='2'>...</w:p>
<w:bdr>...</w:bdr>
<w:p val='1'>...</w:p>
<w:p val='1'>...</w:p>
<w:p val='3'>...</w:p>
<w:p val='3'>...</w:p>
<wx:sub-section>
same structure one step down
<wx:sub-section>
same structure one step down (and so forth up to 5 steps)
</wx:sub-section>
</wx:sub-section>
</wx:sub-section>
</wx:sect>
我的样式表(xslt 2.0)
我知道在//wx:sect/wx:sub-section
中,我仅使用wx:sub-section
的第一层(无论如何都要张贴,以得到更好的概述)。到目前为止,我使用//wx:sect/wx:sub-section[w:p and not(wx:sub-section)]
来捕获其他层,但这是不正确的,因为它们也会掉出来。另一种可能性是单独匹配图层(//wx:sect/wx:sub-section/wx:sub-section
...)。这似乎也不正确。
<!-- Identity Transformation -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/wx:sect/wx:sub-section">
<xsl:for-each-group select="w:p"
group-adjacent="@w:val">
<xsl:choose>
<xsl:when test="current-grouping-key() = '1">
<div class="wrap1">
<xsl:copy-of select="current-group()"/>
</div>
</xsl:when>
<xsl:when test="current-grouping-key() = '2'">
<div class="wrap2">
<xsl:copy-of select="current-group()"/>
</div>
</xsl:when>
...
<xsl:otherwise>
<xsl:copy-of select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:template>
想要的结果
<wx:sect>
<wrapper1>
<w:p val='1'>...</w:p>
<w:p val='1'>...</w:p>
</wrapper1>
<wx:sub-section>
<wrapper1>
<w:p val='1'>...</w:p>
<w:p val='1'>...</w:p>
</wrapper1>
<w:tbl>...<w:tbl>
<w:bdr>...</w:bdr>
<wrapper2>
<w:p val='2'>...</w:p>
<w:p val='2'>...</w:p>
</wrapper2>
<w:bdr>...</w:bdr>
<wrapper1>
<w:p val='1'>...</w:p>
<w:p val='1'>...</w:p>
</wrapper1>
<wrapper3>
<w:p val='3'>...</w:p>
<w:p val='3'>...</w:p>
</wrapper3>
<wx:sub-section>
same structure
<wx:sub-section>
same structure (up to 5 steps)
</wx:sub-section>
</wx:sub-section>
</wx:sub-section>
</wx:sect>