我正在使用xslt 1.0并尝试使用XSLT文档函数将样式表应用于文件夹层次结构。文件夹结构如下所示,但我似乎无法在网上找到有关如何执行此操作的任何可靠参考。
a/
└── b
└── c
├── d
├── e
├── f
有没有办法可以通过文件夹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.
答案 0 :(得分:2)
我不确定这是否是在您的用例上下文中实现您想要实现的内容的可行/合理方法;但是,您可以使用初始计划,即使用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文件的同一文件夹中。
答案 1 :(得分:0)
如果链接是相对的,那么它们将根据初始样式表的基URI进行解析,因此可能无效。在XSLT 2.0中,您具有resolve-uri
功能。
答案 2 :(得分:0)
许多XSLT 2.0处理器以允许您查询filestore中的目录结构的方式实现collection()函数。我不知道XSLT 1.0处理器中有任何等效扩展。