有一个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>
2 回答
选择变量 template-names 会查询 transformation source document - 而不是包含的样式表 . 如果要引用g:registered-templates,则必须像第二个源文档一样指向该文件 .
EDIT
我不太确定 . 但看起来你想根据属性值创建一个元素 . 在这种情况下,这对你来说很有意思 .
好吧,我的理解是错的 .
document('')
函数无论如何都会打开文件,所以它在性能方面没有优势,超过document('registered.xsl')
. 并且由于它查询文件,而不是当前文档的现在修改的DOM模型,因此结果不包括我的包含 .就我而言,不可能查询转换模板本身的DOM模型 .