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

更具体地说,对于集合.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。

关于这个问题的任何建议将不胜感激!

解决方案非常简单。根据node-libxslt文档:

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

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

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

相关内容

  • 没有找到相关文章

最新更新