【问题标题】:Pass source xml file name as a parameter to the stylesheet将源 xml 文件名作为参数传递给样式表
【发布时间】:2015-07-15 09:56:10
【问题描述】:

据我了解,没有办法让 XSLT 1.0 在样式表中接受直接功能,如“base-uri()”或类似的,我已经阅读了一种方法,当您“将源 xml 文件名作为样式表的参数”。

这到底是什么意思?

我的情况是我有大量的 XML 文件和一个样式表,我想将它们用于所有这些文件。

在 head 部分,当 XSLT 转换时,我真的很想显示源 xml 文件名(即调用样式表的文件)。

如何以最简单的方式做到这一点?

非常感谢!

/保罗

【问题讨论】:

  • 那么您使用哪个 XSLT 处理器,如何使用它(从命令行,使用另一种编程语言和处理器的 API)?传递参数的方式取决于特定的 XSLT 处理器及其命令行选项或其 API。
  • Martin,这是尽可能简单的。我有一个用“gedit”制作的手工样式表,所有的处理都是由浏览器完成的。我已经在 Firefox、Google Chrome 和 IExplorer 中进行了尝试,并且样式表可以正常工作,所以基本上应该这样做(如果可能的话)——考虑到未来的读者只能使用浏览器。
  • 您是否使用 XML 文件中的处理指令将 XML 绑定到样式表,例如 <?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>
  • 如何“在浏览器中完成”处理?使用Javascript?还是使用<?xml-stylesheet ...?>?使用 Javascript 你可以设置一个参数(见developer.mozilla.org/en-US/docs/…),使用<?xml-stylesheet ...?>你不能,除了在Mozilla浏览器中,developer.mozilla.org/en-US/docs/Web/XSLT/PI_Parameters有一些限制。
  • 您是否使用mystyle.xsl 将XML 转换为HTML?

标签: xml xslt


【解决方案1】:

假设您的 XSLT 将您的 XML 输入转换为 HTML,那么在您的 HTML 中,您可以使用 Javascript 分别读出 window.location.href 其组件。在特定位置使用客户端 Javascript 简单地输出内容的常用方法是 document.write,但 Gecko 浏览器在 XSLT 转换的 HTML 结果中不支持这种方式。但是,您可以使用 DOM 方法,例如 createTextNodereplaceChildappendChild,以下尝试通过将 script 元素替换为文本节点来模拟 document.write 的效果:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
  <html>
    <head>
      <title>Test</title>
      <script>
      function outputUrl() {
      var currentScripts = document.getElementsByTagName('script');
        var lastScript = currentScripts[currentScripts.length - 1];
        var fileUrl = window.location.href;
        var steps = fileUrl.split('/');
        var fileName = steps[steps.length - 1];
        lastScript.parentNode.replaceChild(document.createTextNode(fileName), lastScript);
      }
      </script>
    </head>
    <body>
      <h1>Test</h1>
      <section>
        <h2>File : <script>outputUrl();</script></h2>
      </section>
      <xsl:apply-templates/>
    </body>
  </html>
</xsl:template>

<xsl:template match="footer">
  <section>
    <h2>Footer of file : <script>outputUrl();</script></h2>
  </section>
</xsl:template>

</xsl:stylesheet>

在使用当前版本的 Firefox、Chrome 和 IE(在 Windows 8.1 上)的在线测试 http://home.arcor.de/martin.honnen/xslt/test2015071502.xml 中,文件名显示在正确的位置,但是当存在更多 script 元素时,我没有测试过这种方法带有src 属性或deferasync。但是您始终可以确保将&lt;span id="fileName"&gt;&lt;/span&gt; 放在需要文件名的位置,然后使用document.getElementById('fileName').textContent = fileName;,这样输出就不会依赖于希望document.getElementsByTagName('script') 集合具有当前@987654336 的可能脆弱的方法@ 作为最后一项。

【讨论】:

  • Martin,我只是简单地尝试了一下,它似乎完全符合我的要求。感谢您分享这个。现在我必须将它与我现有的样式表结合在一起,以将它们组合成有用的东西。太好了!!
猜你喜欢
  • 2021-12-29
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 2019-05-17
相关资源
最近更新 更多