2012-05-17 41 views
0

一个人怎么导入样式表,将实际参数值 给被叫样式表?这里是一个例子。导入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:

+1

对不起,但尽管我试图理解这里提到的问题,但我一直很努力。样式表不被称为 - 这是令人困惑的。你究竟想要达到什么?请问,编辑这个问题让它更有意义? –

+0

是的你是对的,样式表被导入或包含,不叫。问题相应更新。在编译的某个点,导入的样式表的形式参数需要绑定到某些特定的实际值。问题的关键是如何在调用样式表中绑定该值。 Michael的回答是你在调用样式表中定义了一个名称相同的参数或变量。我对此感到惊讶。从程序背景来看,我期待着一个类似的参数绑定机制,如果调用一个命名模板或函数,您将使用它。 –

+1

是的,这里我们有导入优先规则。导入样式表模块中的任何全局变量在任何导入(直接或间接)样式表中都可见,并覆盖任何这些样式表模块中的任何同名变量。这是因为'xsl:import'语句总是必须在任何其他全局级语句之前出现。所以aglobal'xsl:variable总是出现在任何'xsl:import'之后并具有更高的优先级。 –

回答

1

您可以覆盖XSL PARAM或XSL:变量(出现在顶层,即XSL的:stylesheet的子进口模块)。

<xsl:variable name="x" select="some-function($y)" /> 
+0

谢谢。我买了你的书btw。我会推荐给任何人。关于它的最好的部分是骑士之旅 - 这真是令人愉快。 –