XSLT:如何注入文档,然后对其应用模板?

时间:2016-03-23 10:36:32

标签: xslt

我正在尝试使用XSLT组合和处理多个文件。这是我正在使用的结构类型的一个例子:

page.html中

<html>
    <head/>
</html>

head.html

<head>
    <title />
</head>

proc.xsl

<xsl:template match="/html/head">
    <xsl:apply-templates select="document('head.html')/head" />
</xsl:template>

<xsl:template match="/head/title">
    <title>this is a contrived example</title>
</xsl>

我正在对proc.xsl申请page.html。一切正常,但请注意第二个模板元素中的匹配必须相对于包含的文档而不是包含它的文档。那是明智的吗?有没有办法确保apply-templates指令在包含文档的上下文中有效,而不是包含在内?

澄清一下,我要找的结果是:

<html>
    <head>
        <title>this is a contrived example</title>
    </head>
</html>

我也试过用这样的xsl文件包含/ import:

head.xsl

<xsl:template match="/html/head">
    <head>
        <title />
    </head>
</xsl:template>

同样,这会使头部标记很好,但无法处理title元素。

1 个答案:

答案 0 :(得分:0)

你永远不会将文档('head.html')/ head元素放入当前文档(或任何不是根元素的文档)中,所以期望它被解释为/ html / head会有点奇怪。

现在,您可以将此元素复制到其他文档中,然后在您真正需要该行为的情况下对其应用模板。

<xsl:variable name="head">
    <html>
        <xsl:copy-of select="document('head.html')/head" />
    </html>
</xsl:variable>

<xsl:apply-templates select="exsl:node-set($head)/html/head"/>

也许?