XSLT 1.0包装第一个元素和所有以下兄弟姐妹



我正在尝试将所有<list>元素包装在<div>中。<list>元素都是彼此的兄弟姐妹。我认为将第一个元素匹配并将模板应用于所有元素,并且在<div>中的所有兄弟姐妹都足够了,但是我似乎在这里缺少某些内容。

我有以下XML:

<section.body>
    <para>
        <list>
            ...
        </list>
        <list>
            ...
        </list>
        <list>
            ...
        </list>
    </para>
</section.body>

和以下XSLT:

<xsl:template match="section.body/para/list[1]">
  <div>
      <xsl:attribute name="class">
          <xsl:value-of select="'&listWrapperClass;'"/>
      </xsl:attribute>
      <xsl:apply-templates select=".|following-sibling::list"/>
  </div>
</xsl:template>

带有预期的结果:

<div class="sectionClass">
  <div class="paraClass">
      <div class="listWrapperClass">
          <div class="listClass"/>
          <div class="listClass"/>
          <div class="listClass"/>
          <div class="listClass"/>
      </div>
  </div>
</div>

试图应用模板并将其碎裂时,这似乎被循环陷入困境。不太确定我在这里缺少什么,所以会不胜感激!

此样式表

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
    <xsl:template match="section.body">
        <div class="sectionClass">
            <xsl:apply-templates/>
        </div>
    </xsl:template>
    <xsl:template match="section.body/para">
        <div class="paraClass">
            <xsl:apply-templates/>
        </div>
    </xsl:template>

    <xsl:template match="section.body/para/list[1]">
        <div>
            <xsl:attribute name="class">
                <xsl:value-of select="'listWrapperClass'"/>
            </xsl:attribute>
            <div class="listClass">
                <xsl:apply-templates/>
            </div>
            <xsl:apply-templates select="following-sibling::list" mode="group"/>
        </div>
    </xsl:template>
    <xsl:template match="section.body/para/list[position()!=1]"/>
    <xsl:template match="section.body/para/list[position()!=1]" mode="group">
        <div>
            <xsl:attribute name="class">
                <xsl:value-of select="'listClass'"/>
            </xsl:attribute>
            <xsl:apply-templates/>
        </div>
    </xsl:template>
</xsl:stylesheet>

应用于XML输入时,会产生:

<?xml version="1.0" encoding="utf-8"?>
<div class="sectionClass">
    <div class="paraClass">
        <div class="listWrapperClass">
            <div class="listClass"> ... </div>
            <div class="listClass"> ... </div>
            <div class="listClass"> ... </div>
        </div>
    </div>
</div>

最新更新