XSLT:将样式表包含在主样式表中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSLT:将样式表包含在主样式表中相关的知识,希望对你有一定的参考价值。

我正在为一个大项目编写一个XSLT 1.0样式表,它正变得越来越大。我想将一些部分放在单独的较小样式表中,并在我的“主要”样式表中使用xsl:include。所有XSLT样式表都在同一目录中。

我已经看到了许多琐碎的例子,这些例子表明仅仅在主样式表中包含像<xsl:include href="smallerStylesheet.xslt"/>这样的语句就可以完成这项工作。我尝试了,但得到了烦人的I/O warning : failed to load external entity "smallerStylesheet.xslt"。尝试过各种各样的事情,如<xsl:include href="file:///smallerStylesheet.xslt"/><xsl:include href="file:./smallerStylesheet.xslt"/>和许多其他变种。

在本地计算机上指定文件的完整路径效果很好,但不是一个选项,因为它应该作为独立服务运行。我研究了这个主题,发现我的样式表的基URI对于正确解析相对URI路径很重要。然而,我无法找到解决问题的适当方法。

编辑:

我试图让几个更简单的例子起作用,例如https://msdn.microsoft.com/en-us/library/ms256125(v=vs.110).aspx

更具体地说,使用collection.xml:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="xslinclude.xsl"?>
<COLLECTION>
   <BOOK>
      <TITLE>Lover Birds</TITLE>
      <AUTHOR>Cynthia Randall</AUTHOR>
      <PUBLISHER>Lucerne Publishing</PUBLISHER>
   </BOOK>
   <BOOK>
      <TITLE>The Sundered Grail</TITLE>
      <AUTHOR>Eva Corets</AUTHOR>
      <PUBLISHER>Lucerne Publishing</PUBLISHER>
   </BOOK>
   <BOOK>
      <TITLE>Splish Splash</TITLE>
      <AUTHOR>Paula Thurman</AUTHOR>
      <PUBLISHER>Scootney</PUBLISHER>
   </BOOK>
</COLLECTION>

主样式表xslinclude.xsl:

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

<xsl:output method="xml" omit-xml-declaration="yes"/>

<xsl:template match="/">
   <xsl:for-each select="COLLECTION/BOOK">
      <xsl:apply-templates select="TITLE"/>
      <xsl:apply-templates select="AUTHOR"/>
      <xsl:apply-templates select="PUBLISHER"/>
      <BR/>  <!-- add this -->
   </xsl:for-each>
</xsl:template>

<!-- The following template rule will not be called,
  because the related template in the including stylesheet
  will be called. If we move this template so that
  it follows the xsl:include instruction, this one
  will be called instead.-->
<xsl:template match="TITLE">
  <DIV STYLE="color:blue">
    Title: <xsl:value-of select="."/>
  </DIV>
</xsl:template>

<xsl:include href="xslincludefile.xsl" />

</xsl:stylesheet>

还有一个较小的样式表xslincludefile.xsl:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xml:space="preserve">

<xsl:template match="TITLE">
   Title - <xsl:value-of select="."/><BR/>
</xsl:template>

<xsl:template match="AUTHOR">
   Author - <xsl:value-of select="."/><BR/>
</xsl:template>

<xsl:template match="PUBLISHER">
   Publisher - <xsl:value-of select="."/><BR/><!-- removed second <BR/> -->
</xsl:template>

</xsl:stylesheet>

我得到错误Failed: xsl:include : unable to load xslincludefile.xsl。两个样式表都在同一目录中。我正在使用Node.js和node-libxslt。

任何关于这个问题的建议都将受到高度赞赏!

答案

解决方案结果非常简单。 As per node-libxslt documentation

支持XSL包含但必须从执行目录(通常是项目的根目录)提供相对路径

因此,如果样式表位于“项目”文件夹中,请确保指定:

<xsl:include href="project/xslincludefile.xsl" />

以上是关于XSLT:将样式表包含在主样式表中的主要内容,如果未能解决你的问题,请参考以下文章

通过 .NET 将参数传递给 XSLT 样式表

将 XSLT 样式表应用于亚马逊产品广告 API XML 输出

如何将标题添加到由 XSLT 样式表转换的 HTML?

可以将 XSLT 样式表添加到序列化的 XML 文档吗?

如何在 C# 中应用 XSLT 样式表

当我将 XSLT 样式表应用到 XML 文件时,啥也没有出现