减少对xsl:if和代码重复的需求

时间:2014-03-10 04:15:57

标签: xml xslt

我的XSLT代码只有一个类元素不同。但是,所有内部div内容。

我试图将起始标签分开:

 <xsl:if test="position() = 1">
        <div class="position first">

 </xsl:if>
 <xsl:if test="position() != 1">
        <div class="position">
  </xsl:if>

但是当然它产生了无效的XSLT代码。 [DIV&#39; s必须在其范围内关闭]。

是否有另一种方法可以添加可选的class关键字,而不必重复内部内容?

3 个答案:

答案 0 :(得分:3)

试试这个:

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

xsl:attribute指令应覆盖文字属性。

答案 1 :(得分:1)

您可以使用xsl:choose。下面给出了一个示例模板

<xsl:template match="div">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:choose>
            <xsl:when test="position() = 1">
                <xsl:attribute name="class">position first</xsl:attribute>
            </xsl:when>
            <xsl:otherwise>
                <xsl:attribute name="class"><xsl:value-of select="concat('position', position())"/></xsl:attribute>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

答案 2 :(得分:1)

这是一种替代方法,您可以在不重复使用XSLT中的“position”类的情况下执行此操作:

<div class="position{substring(' first', 1, 6 * (position() = 1))}">
    <!-- Whatever goes inside the div -->
</div>

你可以在XSLT 2.0中更干净地做到这一点:

<div class="position{if (position() = 1) then ' first' else ''}">
    <!-- Whatever goes inside the div -->
</div>