【问题标题】:How to pass parameters to XSLT?如何将参数传递给 XSLT?
【发布时间】:2010-07-14 22:48:56
【问题描述】:

我有问题。

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

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

但是,如果我只想显示 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>
 ...

我知道我可以编写一个名为“eng100.xsl”的 XSLT 文件来循环遍历 XML 并仅显示 ENG 100,但我不想编写几十个这样的文件。

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

有没有办法将参数传递到 XSLT 中?

【问题讨论】:

  • 请注意,答案部分取决于您使用的 XSLT 引擎以及调用方式。

标签: xml xslt parameters parameter-passing


【解决方案1】:

您可以将参数传递给 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 文件并将它们作为管道运行。

【讨论】:

  • 另外,在某些情况下,您可以使用“元数据”输入文档来驱动转换并使用document() 函数访问“数据”文档。这会降低效率。
  • 如果xml文档有处理指令怎么办 是否可以将xsl参数传递给xml文件通过 url 编码的 name=value 参数?我的意思是,我可以这样做:mycontent.xml?courseName=MTH300
猜你喜欢
  • 2012-01-18
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多