\
的match属性定义了该节点
模板规则适用。我认为,匹配的节点是隐式的,来自初始源文档。
例如,这是我的XSLT模板的一部分:
<xsl:template>
此模板处理初始源文档,并将结果保存在变量中。如何让此模板规则适用于<xsl:mode name="unroll" on-no-match="shallow-copy"/>
<xsl:template match="StructFormat[@repeat]" mode="unroll">
...
</xsl:template>
<xsl:variable name="complete-struct">
<xsl:apply-templates mode="unroll"/>
</xsl:variable>
函数加载的临时文档?我这样尝试过,但没有成功:
document()
答案 0 :(得分:1)
具有全局变量的部分
<xsl:variable name="complete-struct">
<xsl:apply-templates mode="unroll"/>
</xsl:variable>
构建一个变量来处理全局上下文项(https://www.w3.org/TR/xslt-30/#dt-global-context-item)的子节点
您可以将其更改为
<xsl:variable name="complete-struct">
<xsl:apply-templates select="doc('a.xml')/node()" mode="unroll"/>
</xsl:variable>
处理来自另一个文档的节点,或者如果您运行带有其API的XSLT处理器,请检查在哪里/如何将全局上下文项设置为特定文档(如果需要/需要)(对于Saxon 9.9,请参见http://saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/Xslt30Transformer.html#setGlobalContextItem-net.sf.saxon.s9api.XdmItem-)。
我认为您尝试添加
<xsl:template match="@*|node()" mode="unroll">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
是错误的,您的初始代码中有一个声明<xsl:mode name="unroll" on-no-match="shallow-copy"/>
,该声明应该可以正常工作,如果您希望将其拼写出来,则需要
<xsl:template match="@*|node()" mode="unroll">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="#current"/>
</xsl:copy>
</xsl:template>