一个人怎么导入样式表,将实际参数值 给被叫样式表?这里是一个例子。导入XSLT样式表与应用的样式表参数
比方说,我有一个通用的样式表,它需要一个参数“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中都可能吗?
插图Michael Kay的答案
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>
命令行调用:
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'有一个xsl PARAM:
对不起,但尽管我试图理解这里提到的问题,但我一直很努力。样式表不被称为 - 这是令人困惑的。你究竟想要达到什么?请问,编辑这个问题让它更有意义? –
是的你是对的,样式表被导入或包含,不叫。问题相应更新。在编译的某个点,导入的样式表的形式参数需要绑定到某些特定的实际值。问题的关键是如何在调用样式表中绑定该值。 Michael的回答是你在调用样式表中定义了一个名称相同的参数或变量。我对此感到惊讶。从程序背景来看,我期待着一个类似的参数绑定机制,如果调用一个命名模板或函数,您将使用它。 –
是的,这里我们有导入优先规则。导入样式表模块中的任何全局变量在任何导入(直接或间接)样式表中都可见,并覆盖任何这些样式表模块中的任何同名变量。这是因为'xsl:import'语句总是必须在任何其他全局级语句之前出现。所以aglobal'xsl:variable总是出现在任何'xsl:import'之后并具有更高的优先级。 –