Существует XSL, который включает в себя еще один XSL:
<xsl:include href="registered.xsl"/>
Этот файл содержит список узлов:
<g:registered>
<node1/>
<node2/>
</g:registered>
Документация гласит, что "дочерние элементы элемента <xsl:stylesheet>
в этом документе заменяют элемент во включающем документе", поэтому я думаю, что с учетом директивы include я могу выбрать g: зарегистрированные узлы, как если бы они всегда принадлежал к входящему документу:
select="document('')/xsi:schema/g:registered"
Это возвращает пустой набор узлов.
Однако это:
select="document('registered.xsl')/xsi:schema/g:registered"
выбирает то, что требуется, но это, как я полагаю, означает, что второй раз открывается включенный файл, что мне не нравится.
Так как же выбрать эти включения, не открывая файл второй раз?
EDIT
Запрошенная структура документа:
Включенный документ:
<?xml version='1.0' encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:g="http://www.sample.com/ns">
<g:registered-templates>
<SampleTemplate/>
<WrongTemplate/>
</g:registered-templates>
<xsl:include href="Sample Template.xsl" />
<xsl:include href="Wrong Template.xsl" />
</xsl:stylesheet>
Включая документ:
<?xml version='1.0' encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:g="http://www.sample.com/ns">
<xsl:output method="text"/>
<xsl:include href="Label Registration.xsl"/>
<!-- How do I refer to just loaded inclusion without directing engine to the file again? -->
<xsl:variable name="template-names" select="document('Label Registration.xsl')/xsl:stylesheet/g:registered-templates"/>
<xsl:template match="Job">
<xsl:for-each select="WorkItem">
<xsl:apply-templates select="$template-names/*[local-name()=current()/@name]">
<xsl:with-param name="context" select="." />
</xsl:apply-templates>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>