我一直在学习在XSLT中使用mode属性,并且想知道是否有办法在模板中测试它,例如在xsl:if语句中?我只看到它在xsl:template级别使用,也许这是唯一的方法。假设我想在路径属性(@href)前添加“../”,但仅限于mode =“print”:
<xsl:template name="object" mode="#all">
<img>
<xsl:attribute name="src">
<xsl:if test="mode='print'"><xsl:text>../</xsl:text></xsl:if>
<xsl:value-of select="@href"/>
</xsl:attribute>
</img>
</xsl:template>
我正在调用带有和不带各种其他模板的mode =“print”设置的apply-templates。
当然我可以使用mode =“print”创建一个新模板,但是我必须维护两个模板。
或许有更好的方法可以做到这一点?谢谢您的帮助。 - 斯科特
答案 0 :(得分:3)
目前还没有直接的方法。一种方法可以是 -
<xsl:template match="/">
<xsl:apply-templates select="something" mode="a">
<xsl:with-param name="mode" select="'a'" tunnel="yes"/>
</xsl:apply-templates>
<xsl:apply-templates select="something" mode="b">
<xsl:with-param name="mode" select="'b'" tunnel="yes"/>
</xsl:apply-templates>
</xsl:template>
然后在比赛中 -
<xsl:template match="blah" mode="a b">
<xsl:param name="mode" tunnel="yes"/>
<xsl:if test="$mode='a'">
<!-- Do Something -->
</xsl:if>
<xsl:if test="$mode='b'">
<!-- Do Something -->
</xsl:if>
</xsl:template>
答案 1 :(得分:0)
无法获得当前模式,但您可以这样做:
<xsl:template match="object" mode="#all">
<xsl:param name="print" select="false()"/>
<!-- Your code here -->
</xsl:template>
<xsl:template match="object" mode="print">
<xsl:next-match>
<xsl:with-param name="print" select="true()"/>
</xsl:next-match>
</xsl:template>