使用应用的样式表参数导入XSLT样式表

时间:2012-05-17 06:55:56

标签: xslt xslt-2.0

如何导入样式表,应用实际参数值 被称为样式表?这是一个例子。

假设我有一个带有参数“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!'

1 个答案:

答案 0 :(得分:1)

您可以使用xsl:param或xsl:变量覆盖xsl:param(出现在顶层,即导入模块中xsl:stylesheet的子代)。

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