<xsl:apply-imports> 的示例 1

此示例演示如何使用 <xsl:apply-imports> 来更有效地重复使用代码。示例使用四个主要文件:

  • XML 源文件 ops.xml。此数据文件定义三个运算:add (+)、sub (-) 和 mul (*)。

  • 主要 XSLT 样式表 ops.xsl。此文件包含运算的模板规则,包括两个 <xsl:import> 元素。导入的样式表对给定的数据源执行算术运算和字符串运算。

  • 导入的样式表 arith.xsl。此 XSLT 文件对每个 <op> 元素执行算术运算。

  • 另一个导入的样式表 str.xsl。此 XSLT 文件执行自定义字符串运算。此处的 add (+) 作为字符串串联对待;例如 1+2 成为 12。与此类似,mul (*) 作为反向串联对待;1*2 成为 21。注意,sub (-) 是未定义的字符串运算。

XML 文件 (ops.xml)

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="ops.xsl"?>
<ops>
  <desc>Some binary operations</desc>
  <op name="add" symbol="+">
    <operand>1</operand>
    <operand>2</operand>
  </op>
  <op name="sub" symbol="-">
    <operand>1</operand>
    <operand>2</operand>
  </op>
  <op name="mul" symbol="*">
    <operand>1</operand>
    <operand>2</operand>
  </op>
</ops>

主要 XSLT 文件 (ops.xsl)

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                version="1.0">
  <xsl:import href="arith.xsl"/>
  <xsl:import href="str.xsl"/>
  <xsl:template match="op">
    <xsl:value-of select="operand[1]"/>
    <xsl:value-of select="@symbol"/>
    <xsl:value-of select="operand[2]"/>
    = <xsl:apply-imports/>
    <br/>
  </xsl:template>
</xsl:stylesheet>

导入的 XSLT 文件 (arith.xsl)

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                version="1.0">
  <xsl:template match="op[@symbol='+']">
    <xsl:value-of select="sum(operand)"/> (from arith.xsl)
  </xsl:template>
  <xsl:template match="op[@symbol='-']">
    <xsl:value-of select="number(operand[1])-number(operand[2])"/> 
   (from arith.xsl)
  </xsl:template>
  <xsl:template match="op[@symbol='*']">
    <xsl:value-of select="number(operand[1])*number(operand[2])"/> 
    (from arith.xsl)
  </xsl:template>
</xsl:stylesheet>

导入的 XSLT 文件 (str.xsl)

<?xml version="1.0"?>
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                  version="1.0">
  <xsl:template match="desc">
    <DIV><xsl:value-of select="."/></DIV>
  </xsl:template>
  <xsl:template match="op[@name='add']">
    <xsl:value-of select="operand[1]"/>
    <xsl:value-of select="operand[2]"/> (from str.xsl)
  </xsl:template>
  <xsl:template match="op[@name='mul']">
    <xsl:value-of select="operand[2]"/>
    <xsl:value-of select="operand[1]"/> (from str.xsl)
  </xsl:template>
</xsl:stylesheet>

输出

您应获得下面的输出:

Some binary operations

1+2 = 12 (from str.xsl)

1-2 = -1 (from arith.xsl)

1*2 = 21 (from str.xsl)

注释

最后一个导入的样式表的导入优先级最高。在此示例中,str.xsl 是最后一个导入的,因此,导入优先级高于 arith.xsl。两个导入的样式表都提供 add 和 mul 运算的模板。只调用 str.xsl 中的模板。但是,使用 arith.xsl 中定义的 sub 运算,因为 str.xsl 中没有定义 sub 运算。假设我们颠倒主 XSLT 文件中 <xsl:import> 元素的顺序,就像这样:

<xsl:import href="str.xsl"/>

<xsl:import href="arith.xsl"/>

在这种情况下,输出将类似于以下内容:

Some binary operations

1+2 = 3 (from arith.xsl)

1-2 = -1 (from arith.xsl)

1*2 = 2 (from arith.xsl)

此外,如果 <xsl:apply-imports/> 指令从主 XSLT 文件 (ops.xsl) 的 <op> 的重写模板规则中消失,则会有如下输出:

Some binary operations

1+2 =

1-2 =

1*2 =

即,导入样式表中的模板规则重写导入的样式表中相关的模板规则。<xsl:apply-imports/> 指令能让您以不同方式重新激活那些被重写的模板规则。