XSLT 1.0包装第一个元素和所有后续兄弟

时间:2014-01-29 21:23:16

标签: 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>

在尝试应用模板并闯入我时,似乎陷入了循环。不太确定我在这里缺少什么,所以任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

此样式表

<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>