如何匹配子级元素进行分组,而不会删除同级?

时间:2018-08-22 08:47:05

标签: xml xpath xslt-2.0 xslt-grouping

我在这里什么都没走。我想将相邻的w:p元素分组。否则,不应再更改文档。在第一个XSLT转换中,我进行身份转换,在其中使用for-each-groupgroup-adjacent创建组。但是兄弟元素(w:tblw: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>

0 个答案:

没有答案