在 XSLT 2 中对多个组进行分组

发布于 2024-08-19 17:08:41 字数 1527 浏览 11 评论 0原文

我正在尝试将层次结构添加到一些糟糕的挤压排版 XML 中。我似乎无法同时将多种组分组到同一父元素中。

我所拥有的(显然是简单的):

<article>
  <h1>A section title here</h1>
  <p>A paragraph.</p>
  <p>Another paragraph.</p>
  <bl>Bulleted list item.</bl>
  <bl>Another bulleted list item.</bl>
  <h1>Another section title</h1>
  <p>Yet another paragraph.</p>
</article>

我想要的:

<article>
  <sec>
    <h1>A section title here</h1>
    <p>A paragraph.</p>
    <p>Another paragraph.</p>
    <list>
      <list-item>Bulleted list item.</list-item>
      <list-item>Another bulleted list item.</list-item>
    </list>
  </sec>
  <sec>
    <h1>Another section title</h1>
    <p>Yet another paragraph.</p>
  </sec>
</article>

这几乎适用于列表项:

<xsl:for-each-group select="*" group-adjacent="boolean(self::BL)">
   <xsl:choose>
      <xsl:when test="current-grouping-key()">
         <list><xsl:apply-templates select="current-group()"/></list>
      </xsl:when>
      <xsl:otherwise>
         <xsl:apply-templates select="current-group()"/>
            </xsl:otherwise>
   </xsl:choose>
 </xsl:for-each-group>

但它只处理文章中的第一个列表;一旦我尝试添加另一个 xsl:for-each-group 来覆盖这些部分,列表项就会停止工作。

有想法吗?非常感谢!

I'm trying to add hierarchy to some grotty extruded typesetting XML. I can't seem to manage grouping several kinds of groups in the same parent element at once.

What I have (simplified, obviously):

<article>
  <h1>A section title here</h1>
  <p>A paragraph.</p>
  <p>Another paragraph.</p>
  <bl>Bulleted list item.</bl>
  <bl>Another bulleted list item.</bl>
  <h1>Another section title</h1>
  <p>Yet another paragraph.</p>
</article>

What I want:

<article>
  <sec>
    <h1>A section title here</h1>
    <p>A paragraph.</p>
    <p>Another paragraph.</p>
    <list>
      <list-item>Bulleted list item.</list-item>
      <list-item>Another bulleted list item.</list-item>
    </list>
  </sec>
  <sec>
    <h1>Another section title</h1>
    <p>Yet another paragraph.</p>
  </sec>
</article>

This almost works for the list items:

<xsl:for-each-group select="*" group-adjacent="boolean(self::BL)">
   <xsl:choose>
      <xsl:when test="current-grouping-key()">
         <list><xsl:apply-templates select="current-group()"/></list>
      </xsl:when>
      <xsl:otherwise>
         <xsl:apply-templates select="current-group()"/>
            </xsl:otherwise>
   </xsl:choose>
 </xsl:for-each-group>

but it only handles the very first list in an article; and as soon as I try to add another xsl:for-each-group to cover the sections, the list-item one stops working.

Ideas? Many thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我的黑色迷你裙 2024-08-26 17:08:41

以下是一个示例样式表,它生成您为您发布的输入示例发布的输出:

<xsl:stylesheet
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:strip-space elements="*"/>
  <xsl:output indent="yes"/>

  <xsl:template match="article">
    <xsl:copy>
      <xsl:for-each-group select="*" group-starting-with="h1">
        <sec>
          <xsl:copy-of select="."/>
          <xsl:for-each-group select="current-group() except ." group-adjacent="boolean(self::bl)">
            <xsl:choose>
              <xsl:when test="current-grouping-key()">
                <list>
                  <xsl:apply-templates select="current-group()"/>
                </list>
              </xsl:when>
              <xsl:otherwise>
                <xsl:copy-of select="current-group()"/>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:for-each-group>
        </sec>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="bl">
    <list-item>
      <xsl:apply-templates/>
    </list-item>
  </xsl:template>

</xsl:stylesheet>

Here is a sample stylesheet that produces the output you posted for the input sample you posted:

<xsl:stylesheet
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:strip-space elements="*"/>
  <xsl:output indent="yes"/>

  <xsl:template match="article">
    <xsl:copy>
      <xsl:for-each-group select="*" group-starting-with="h1">
        <sec>
          <xsl:copy-of select="."/>
          <xsl:for-each-group select="current-group() except ." group-adjacent="boolean(self::bl)">
            <xsl:choose>
              <xsl:when test="current-grouping-key()">
                <list>
                  <xsl:apply-templates select="current-group()"/>
                </list>
              </xsl:when>
              <xsl:otherwise>
                <xsl:copy-of select="current-group()"/>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:for-each-group>
        </sec>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="bl">
    <list-item>
      <xsl:apply-templates/>
    </list-item>
  </xsl:template>

</xsl:stylesheet>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文