Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT:如何注入文档,然后对其应用tempates?_Xslt - Fatal编程技术网

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

XSLT:如何注入文档,然后对其应用tempates?,xslt,Xslt,我正在尝试使用XSLT组合和处理几个文件。以下是我正在使用的结构类型的示例: page.html <html> <head/> </html> 我还尝试使用如下xsl文件包含/导入: head.xsl <xsl:template match="/html/head"> <head> <title /> </head> </xsl:template> 同样

我正在尝试使用XSLT组合和处理几个文件。以下是我正在使用的结构类型的示例:

page.html

<html>
    <head/>
</html>
我还尝试使用如下xsl文件包含/导入:

head.xsl

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

同样,这会很好地注入head标记,但无法处理
title
元素。

您从未将document('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"/>


也许?

您能解释一下“您从来没有放置文档('head.html')/head元素”。。。?我以为我所做的就是这样。我知道这可能不是“xslt方式”,但我认为组合多个文档将是一个足够常见的用例,因此在某种程度上这将得到支持。document()函数不包括另一个文档处理过的文档,它只是将其作为单独的节点集进行解析。我认为它不能给正在处理的文档添加任何内容,它是不可变的。解析后的文档(节点集)不包括在任何地方,也不以任何方式与任何其他文档(输入或输出)相关。我不理解您的问题。第二个模板(或任何模板)中的匹配不是“相对于包含的文档”(或任何文档)。
apply templates
指令在调用它的上下文中工作;在您的示例中,在
page.html
文档的
/html/head
上下文中-因为这是由父模板建立的上下文。这里的实际问题是什么?对不起,我肯定术语太离谱了。我的意思是,匹配中的xpath表达式必须以
/head
而不是
/html
开头,即它与加载的文档匹配,而不是将第一个模板应用于初始文档的结果。我将用我想要的结果的一个示例进行更新。您可以将模板匹配更改为
match=“head/title”
match=“title”
,因为这样无论
head
是否是根元素。@TimC这基本上就是我拥有的,但我担心这样的匹配过于笼统,最终可能会在不需要的上下文中匹配标题。然而,考虑到我在这个过程中所做的一切,我认为这可能是最好的方法。如果您希望您的“标题/标题”模板仅与第二个文档匹配,那么您是否可以使用“模式”属性?
<html>
    <head>
        <title>this is a contrived example</title>
    </head>
</html>
<xsl:template match="/html/head">
    <head>
        <title />
    </head>
</xsl:template>
<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"/>