我正在尝试解析一个xml,我需要根据位置()单独更改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>
由于您尚未显示输入的外观,因此任何答案都将涉及一些猜测。
但通常,有两种方法可以使 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
条件的方式将与显示的不同。