<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/> 指令能让您以不同方式重新激活那些被重写的模板规则。