首页 > 解决方案 > 在 XSLT 2 中使用 for-each-group 和 group-adjacent 进行分组和包装

问题描述

显然,我对 XSLT 2 中的分组如何工作的理解还不够好。我确信xsl:for-each-group使用group-adjacentas 属性的方法是正确的。但是,我没有得到想要的结果。

我想在我的 XML 源中对几个相邻的元素进行分组。元素通过后代元素的属性值来标识。我需要用一个新元素(例如p div="lernz")包装它们。有时这些元素显示为邻居,有时则不是。

我的样式表没有得到正确的结果。有时我认为应该是组的第一项之前的元素是匹配的。但是到目前为止,在我的结果中,我认为是一个组的每一个项目都被包装了。错误在哪里?任何帮助是极大的赞赏。

XML 输入

 <wx:sect>
  <w:p>
    <w:pPr w:val = 'Lern'/>
  </w:p>
  <w:p>
    <w:pPr w:val = 'Lern'/>
  </w:p>
  <w:p>
    <w:pPr w:val = 'Merk'/>
  </w:p>
  <w:p>
    <w:pPr w:val = 'Lern'/>
  </w:p>
  <w:p>
    <w:pPr w:val = 'Merk'/>
  </w:p>
</w:sect>

期望的输出

<wx:sect>
   <p div="wrapper-lernz">
       <w:p>
          <w:pPr w:val = 'Lern'/>
        </w:p>
        <w:p>
          <w:pPr w:val = 'Lern'/>
        </w:p>
    </p>
        <w:p>
          <w:pPr w:val = 'Merk'/>
        </w:p>
    <p div="wrapper-lernz">
      <w:p>
        <w:pPr w:val = 'Lern'/>
      </w:p>
    </p>
      <w:p>
        <w:pPr w:val = 'Merk'/>
      </w:p>
</w:sect>

我的样式表(部分)

<xsl:template match="//w:p[w:pPr[@w:val]]">
    <xsl:for-each-group select="current()" group-adjacent="//@w:val = 'Lern">
         <p div="wrapper-lernz">
             <xsl:value-of select="current-group()"/>
          </p>
        </xsl:for-each-group>
    </xsl:template>

标签: xmlxsltgroupingword-wrap

解决方案


您的模板匹配w:p,但如果您想对相邻元素进行分组,您应该匹配父w:sect标签。通过这样做xsl:for-each-group select="current()",您正在尝试对单个元素进行分组。

要处理仅将“lern”元素放在容器标签中,您应该 group-adjacent= 在“w:val”值上,然后xsl:choose决定是否添加父标签。

试试这个模板:

<xsl:template match="//w:sect[w:p[w:pPr/@w:val]]">
  <xsl:copy>
    <xsl:for-each-group select="w:p" group-adjacent="w:pPr/@w:val">
      <xsl:choose>
        <xsl:when test="current-grouping-key() = 'Lern'">
          <p div="wrapper-lernz">
             <xsl:copy-of select="current-group()"/>
          </p>
        </xsl:when>
        <xsl:otherwise>
          <xsl:copy-of select="current-group()"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

(请注意,它也不仅仅返回节点的文本值,而xsl:copy-of不是节点本身)xsl:value-ofxsl:value-of


推荐阅读