Я не уверен, что это выполнимый / разумный способ реализовать то, что вы хотите достичь в контексте вашего варианта использования; однако вы можете остаться с первоначальным планом, который работает с 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.