根据position()更改div标签的属性

时间:2014-11-25 01:25:50

标签: xslt xslt-1.0

我试图解析一个xml,我需要根据第一个单独的position()更改div标签的属性。如您所见,我已经使用了父div的应用模板。如何在应用模板中单独应用第一个div的条件?

<div class="maintitle">
  <xsl:apply-templates select="title"/>
</div>

<xsl:template match="title">
  <h3 class="sub title">
    <span>
      <a href="............"></a>
    </span>
  </h3>

  <div class="slide">

    <!-- ... html chunk ... -->

  </div>
</xsl:template>

但是对于应用模板中的第一个div应该是

 <h3 class="sub title">
   <span>
     <a href="............"></a>
   </span>
 </h3>

 <div class="first slide">

   <!-- ... html chunk ... -->

 </div>

1 个答案:

答案 0 :(得分:0)

由于您没有显示输入的内容,因此任何答案都会涉及一些猜测。

但总的来说,有两种方法可以使XSLT处理系列的第一个元素与其他元素不同。

首先,您可以制作两个不同的模板,一个用于第一个title元素,另一个用于其他元素:

<xsl:template match="title">
  <!--* handling for most title elements *-->
</
<xsl:template match="title[1]">
  <!--* handling for the first title *-->
</

在这种情况下,这可能涉及到比模板代码更多的重复。

其次,您可以使用条件来包围相关代码。在这里,使用XSL属性构造函数而不是文字结果属性将简化:

<xsl:template match="title">
  <h3 class="sub title">
    <span>
      <a href="............"></a>
    </span>
  </h3>

  <div>
    <xsl:attribute name="class">
      <xsl:if test="position() = 1">
        <xsl:text>first</xsl:text>
      </xsl:if>
      <xsl:text> slide</xsl:text>
    </xsl:attribute>

    <!-- ... html chunk ... -->

  </div>
</xsl:template>

这些假设:

  • 输入中的每个title元素都会在输出中变成一张幻灯片;
  • title元素是兄弟姐妹;
  • title元素不与其他类型的元素混合。

如果这些假设不成立,那么您编写match模式或test条件的方式将与显示的不同。