如何导入样式表,将实际参数值应用于被调用的样式表?这是一个插图。
假设我有一个带有参数“x”的通用样式表。它看起来像这样,位于“general.xslt”。
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:param name="x" as="xs:string" />
... style-sheet content ...
</xsl:stylesheet>
我有一个更高级别的样式表(specific.xslt),它希望通过导入来合并 general.xslt 的功能。这个更高级别的样式表(specific.xslt)采用参数“y”。更高级别的样式表需要导入general.xslt,将一个实际参数(y 的某个函数)应用于形式参数x。如果这是合法的 XSLT 2.0 语法,它会是这样的:
更高级别的样式表:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:param name="y" as="xs:string" />
<xsl:import href="general.xslt">
<xsl:with-param name="x" select="some-function($y)" />
</xsl:import>
<xsl:function name="some-function" as="xs:string">
<xsl:param name="value" as="xs:string" />
... content goes here ...
</xsl:function>
... more content ...
</xsl:stylesheet>
当然,以上不是合法的语法,但它说明了我想要实现的目标 - 使用实际参数调用样式表,其方式类似于使用参数调用模板。这在任何版本的 XSLT 中都可能吗?
迈克尔·凯的回答插图
general.xslt:这个低级样式表带有一个参数。形式参数是 x。
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="2.0"
exclude-result-prefixes="xsl xs fn">
<xsl:param name="x" as="xs:string" />
<xsl:template match="/">
<root>
The value of x is <xsl:value-of select="$x" />
</root>
</xsl:template>
</xsl:stylesheet>
specific.xslt:这个高级样式表带有一个参数。形式参数是 y。
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="http://my.com"
version="2.0"
exclude-result-prefixes="xsl xs fn my">
<xsl:import href="general.xslt" />
<xsl:param name="y" as="xs:string" />
<xsl:function name="my:some-function" as="xs:string">
<xsl:param name="value" as="xs:string" />
<xsl:value-of select="concat( $value, '!') " />
</xsl:function>
<xsl:variable name="x" select="my:some-function($y)" />
<xsl:template match="/">
<xsl:apply-imports/>
</xsl:template>
</xsl:stylesheet>
Saxon 的命令行调用:
Transform.exe -s:specific.xslt -xsl:specific.xslt -o:specific-out.xml y=abc
输出:
<?xml version="1.0" encoding="UTF-8"?><root>The value of x is abc!</root>
general.xslt 的实际参数是 'abc!'