【问题标题】:xsl:import and xsl:include in stylesheets don't work on Google Chrome样式表中的 xsl:import 和 xsl:include 在 Google Chrome 上不起作用
【发布时间】:2009-10-25 10:41:37
【问题描述】:

我正在构建一个使用 xsl 样式表的网站,并且我正在使用其他工作表导入的 util 样式表中构建一个有用函数的小型库

<xsl:import href="util" />

在每张纸的顶部。这在 Google Chrome 中不起作用,因为它还不支持 xsl:import。有人可以给我写一个可以在服务器端运行的样式表,它会读取 xsl:import 行并在发送到客户端之前导入相关的样式表?

【问题讨论】:

  • 我不想在服务器端解析xml,我想要一个可以应用于其他xsl文档的xsl文档。从我读过的文档中,我将执行一些使用“document()”函数的东西。

标签: google-chrome xslt


【解决方案1】:

我会执行以下操作,它将在样式表服务器端合并到 Chrome 之前。第一步已经到位,因为xsl:import 与用导入的样式表替换所有地方不同。

  1. 将所有xsl:import 替换为xsl:include(导入优先级不适用于xsl:include,因此您可能需要更改代码并改用优先级)
  2. 使用下面的服务器端样式表在提供之前将它们合并为一个
  3. 等待几周(可能是几个月)。我已经为 Chrome 创建了一个修复程序,目前正在与开发人员团队合作将修复程序包含到构建中。
<xsl:template match="node()">
    <xsl:copy>
       <xsl:copy-of select="@*"/>
       <xsl:apply-templates select="node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="xsl:include">
   <!-- you'll probably want to be a bit more restrictive here -->
   <xsl:copy-of select="document(@href)/xsl:stylesheet/*" />
</xsl:template>

更新:请注意:Safari 中也会出现 Chrome 错误。

【讨论】:

  • 谢谢,正是我需要的。很高兴听到关于长期修复的消息!
  • 不客气 :) 我会将 SO 错误报告给 StackOverflow(如果我删除该草书文本,整个代码块就会消失……奇怪)。
  • 有关于 Chrome 修复的消息吗?
  • @Mikl:我不确定。我记得与其中一位开发人员的电子邮件交流,他询问了一些细节,但它是太久以前无法正确记住它。如果修复没有在最终的发布周期中实施,那就是浪费精力,但是,你不可能赢得所有的 ;)。请注意,可能适用同源策略,这意味着如果您使用绝对 url,它可能不起作用,但相对 url 可以。
  • @Abel:我发现了与此相关的错误:code.google.com/p/chromium/issues/detail?id=8441bugs.webkit.org/show_bug.cgi?id=60276 总有一天我们会赢 =)
【解决方案2】:

您可以在 Python 中使用 libxml2 和 libxslt 模块来完成...不是为您完成所有工作,而是从以下内容开始:

import libxml2, libxslt

styledoc = libxml2.parseFile("page.xsl")
style = libxslt.parseStylesheetDoc(styledoc)
doc = libxml2.parseFile("somefile.xml")
result = style.applyStylesheet(doc, None)

然后把东西送回去。

【讨论】:

    【解决方案3】:

    在 php 中尝试这样的事情:

    <?php
    $sXml  = "<xml>";
    $sXml .= "<testtag>hello tester</testtag>";
    $sXml .= "</xml>";
    
    # LOAD XML FILE
    $XML = new DOMDocument();
    $XML->loadXML( $sXml );
    
    # START XSLT
    $xslt = new XSLTProcessor();
    $XSL = new DOMDocument();
    $XSL->load( 'xsl/index.xsl', LIBXML_NOCDATA);
    $xslt->importStylesheet( $XSL );
    #PRINT
    print $xslt->transformToXML( $XML );
    ?>
    

    【讨论】:

      【解决方案4】:

      http://www.w3.org/TR/xslt#literal-result-element 展示了如何在编写 XSL 样式表时解决重复的 xsl 命名空间问题,该样式表将您现有的 XSL 样式表转换为扩展 &lt;xsl:import&gt;s 的 XSL 样式表。

      不过,请注意&lt;xsl:import&gt;&lt;xsl:include&gt; 之间的区别。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-03
        • 2015-01-08
        • 1970-01-01
        • 2014-10-12
        • 2021-11-20
        • 2015-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多