我正在为一个大项目编写一个XSLT 1.0样式表,它正变得越来越大。我想在一些较小的样式表中加入一些部分,然后在我的" main"中使用它们。带有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。
对此问题的任何建议都将受到高度赞赏!
答案 0 :(得分:1)
解决方案结果非常简单。 As per node-libxslt documentation:
支持XSL包含,但必须从执行目录(通常是项目的根目录)提供相对路径
因此,如果样式表位于“项目”文件夹中,请确保指定:
<xsl:include href="project/xslincludefile.xsl" />