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!'

4

1 回答 1

1

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

<xsl:variable name="x" select="some-function($y)" />
于 2012-05-17T10:17:19.407 回答