为模板规则指定一个临时文档而不是初始源文档

时间:2018-12-17 09:57:55

标签: xslt-3.0

\的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()

1 个答案:

答案 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>