代码之家  ›  专栏  ›  技术社区  ›  Pjoern

在XSLT中包装没有属性的节点组

  •  0
  • Pjoern  · 技术社区  · 6 年前

    我想用一个新的父元素包装元素组。此类组出现在文档的许多地方。元素没有属性。 具有 for-each-group 我设法将文档的所有所需元素包含在一个具有新父元素的大组中,但我想根据它们的出现情况来区分这些组。发现了许多类似的问题和答案,但无法解决问题。

    我的文档

    <modul>
        <body>
            <Standard>some text</Standard>
            <Herausforderung>some text</Herausforderung>
            <Standard>some text
               <d2tb>some text</d2tb>
            </Standard>
            <Aufzhlungbullets>some text</Aufzhlungbullets>
            <Aufzhlungbullets>some text</Aufzhlungbullets>
            <Aufzhlungbullets>some text</Aufzhlungbullets>
            <Standard>some text
               <d2ti>some text</d2ti>
            </Standard0>
            <Aufzhlungbullets>some text</Aufzhlungbullets>
            <Aufzhlungbullets>some text</Aufzhlungbullets>
            <Aufzhlungbullets>some text</Aufzhlungbullets>
            <Standard>some text</Standard>
       </body>
    </modul>
    

    所需输出

    <modul>
            <body>
                <Standard>some text</Standard>
                <Herausforderung>some text</Herausforderung>
                <Standard>some text
                   <d2tb>some text</d2tb>
                </Standard>
                <list>
                   <Aufzhlungbullets>some text</Aufzhlungbullets>
                   <Aufzhlungbullets>some text</Aufzhlungbullets>
                   <Aufzhlungbullets>some text</Aufzhlungbullets>
                </list>
                <Standard>some text
                   <d2ti>some text</d2ti>
                </Standard0>
                <list>
                   <Aufzhlungbullets>some text</Aufzhlungbullets>
                   <Aufzhlungbullets>some text</Aufzhlungbullets>
                   <Aufzhlungbullets>some text</Aufzhlungbullets>
                </list>
                <Standard>some text</Standard>
           </body>
        </modul>
    

    我的XSLT样式表

    <xsl:template match="body">
            <list>
            <xsl:for-each-group select="Aufzhlungbullets" group-by=".">
                    <xsl:copy-of select="current-group()"/>
            </xsl:for-each-group>
            </list>
        </xsl:template>
    

    注意:我知道此模板会抑制所有其他内容。起初,我专注于正确分组。当然,文档其余部分的内容应该是可见的,但我认为这不是一个大问题。

    使用此模板,我只能获得一个大组中的所有元素。

    <modul>
        <list>
          <Aufzhlungbullets>some text</Aufzhlungbullets>
          <Aufzhlungbullets>some text</Aufzhlungbullets>
          <Aufzhlungbullets>some text</Aufzhlungbullets>
          <Aufzhlungbullets>some text</Aufzhlungbullets>
          <Aufzhlungbullets>some text</Aufzhlungbullets>
          <Aufzhlungbullets>some text</Aufzhlungbullets>
          <Aufzhlungbullets>some text</Aufzhlungbullets>
       </list>
    </modul>
    

    我尝试了很多模板的变体,但都没有成功。如何区分所需元素在文档中的不同组中出现?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Tim C    6 年前

    尝试使用 group-adjacent xsl:for-each-group 相反,可以按名称对相邻节点进行分组,并将组包装在 <list> 如果它是 Aufzhlungbullets 节点:

    <xsl:template match="body">
        <list>
            <xsl:for-each-group select="*" group-adjacent="local-name()">
                <xsl:choose>
                    <xsl:when test="self::Aufzhlungbullets">
                        <list>
                            <xsl:copy-of select="current-group()" />    
                        </list>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:copy-of select="current-group()" />
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each-group>
        </list>
    </xsl:template>