2010-07-14 98 views
5

我有一个问题。如何将参数传递给XSLT?

我有一个XML文件,其中包含有关100个课程的信息。

我有一个很好地显示100个课程列表的XSL文件。

但是,如果我只想显示1道菜,该怎么办。我可以传递一个参数给XSLT文件,告诉它只显示“ENGL 100”吗?

的XML看起来是这样的:

<document> 
<menu> 
    <item> 
     <name>MTH 300</name> 
     <brief>Mathematics Skill Development</brief> 
     <description>A course in the fundamentals of ...</description> 
    </item> 
    <item> 
     <name>MTH 301</name> 
     <brief>Basic Algebra</brief> 
     <description>An introduction to algebra, ...</description> 
    </item> 
... 

我知道我可以通过XML编写名为“eng100.xsl” XSLT文件中循环,并只显示ENG 100,但我不希望有写几十个这些文件。

XML是动态的,我可以控制它。我希望XSLT文件是静态的,永远不会改变。

有什么办法可以将参数传递给XSLT吗?

+1

请注意,答案部分取决于您使用的XSLT引擎以及您如何调用它。 – 2010-07-15 05:54:36

回答

6

您可以将参数传递给XSLT,这取决于您的XSLT处理器,但通常作为附加命令参数(如果它是命令行处理器的话)。

您使用

<xsl:param name="courseName" select"initialValue"/> 

然后,您可以测试您的XSLT此参数,并调用取决于它的价值不同的模板声明的参数。例如,如果参数为空,则调用处理所有元素的当前模板,否则调用仅当项目名称等于参数值时处理元素的模板。您可以使用测试

<xsl:template match="item"> 
     <xsl:if test="$courseName=name(./name)"> 
     <xsl:call-template name="yourOriginalTemplate"/> 
     </xsl:if> 
    </xsl:template> 

但是通过过滤和格式,你是在一个文件中混合两种顾虑做到这一点。我将从格式中分离出对XML元素的选择 - 为此提供两个xslt文件并将它们作为管道运行。

+0

很好的答案。 +1。 – 2010-07-14 23:20:06

+0

此外,对于某些场景,您可以使用“元数据”输入文档来驱动转换并使用document()函数访问“数据”文档。这会降低效率。 – 2010-07-14 23:30:11

+3

如果xml文档具有处理指令<?xml-stylesheet type =“text/xsl”href =“mytransformation.xsl”?>如果可以通过url编码的name = value将xsl参数传递给xml文件参数?我的意思是,我可以这样做:mycontent.xml?courseName = MTH300 – brighty 2013-12-03 14:17:28