我正在使用xslt 1.0,并尝试使用xslt文档函数将样式表应用于文件夹层次结构。文件夹结构如下,但我似乎在网上找不到任何关于如何做到这一点的可靠参考资料。
a/
└── b
└── c
├── d
├── e
├── f
有没有一种方法可以通过文件夹a中的文件(a有到文件夹层次结构中文件名的链接)将样式表应用到文件夹f中的节点、文件中。
更新#2
book01.xml
<?xml version="1.0" encoding="utf-8" ?>
<book location="../collection/book01.xml">
<chapter>chapter001</chapteer>
</book>
chapter01.xml
<?xml version="1.0" encoding="utf-8" ?>
<chapter location="../collection/book01/chapter01.xml">
<page>page01</page>
</chapter>
page01.xml
<?xml version="1.0" encoding="utf-8" ?>
<page location="../collection/book01/chapter01/page01.xml">
<pagenumber>page 1</pagenumber>
<text>
page one.
</text>
</page>
Output
Book Name: Book XX
Chapter XX
Page XX
page xx.
我不确定这是否是在用例上下文中实现您想要实现的目标的可行/合理的方法;但是,您可以保留最初的计划,即使用xsl:for-each
和document()
。
例如,假设您有一个带有路径列表的输入文件:
<files>
<file>book001.xml</file>
<file>chapter001.xml</file>
</files>
此输入可以合理地用于定义包含所有输入文档的变量并应用模板:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
version="1.0">
<xsl:template match="files">
<xsl:variable name="docs">
<docs>
<xsl:for-each select="file">
<xsl:copy-of select="document(.)"/>
</xsl:for-each>
</docs>
</xsl:variable>
<xsl:apply-templates select="msxsl:node-set($docs)"/>
</xsl:template>
<!-- now you can match elements of your xml files -->
</xsl:stylesheet>
请注意,我需要扩展函数来计算节点集。这在xsltproc中是明确可用的,或者您也可以从EXSLT中获得它。
在本例中,我假设输入文件位于book001.xml和chapter001.xml文件的同一文件夹中。
如果链接是相对的,那么它们将根据初始样式表的基本URI进行解析,因此这可能不起作用。在XSLT2.0中,您可以使用resolve-uri
函数来实现这一点。
也许您可以实现一个解析uri扩展函数。
许多XSLT2.0处理器实现collection()函数的方式允许您查询文件存储中的目录结构。我不知道XSLT1.0处理器中有任何等效的扩展。