有没有办法在xsl中使用模式:if test?

时间:2014-10-14 21:32:45

标签: xslt xslt-2.0 mode

我一直在学习在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”创建一个新模板,但是我必须维护两个模板。

或许有更好的方法可以做到这一点?谢谢您的帮助。 - 斯科特

2 个答案:

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