Xslt 匹配被调用模板的节点

Xslt 匹配被调用模板的节点,xslt,xslt-2.0,Xslt,Xslt 2.0,假设我的xsl中有一个随机模板: <xsl:template name="keywords"> <test> <foo>bar</foo> <bar>foo</bar> </test> <test> <foo>foobar</foo> <bar>barfoo</bar>

假设我的xsl中有一个随机模板:

<xsl:template name="keywords">
    <test>
        <foo>bar</foo>
        <bar>foo</bar>
    </test>
    <test>
        <foo>foobar</foo>
        <bar>barfoo</bar>
    </test>
<xsl:template>

酒吧
福
福巴
巴福
我想只输出第一个节点集。有没有一种优雅的方法可以做到这一点? 如果节点不在源xml中,而是被调用模板的结果,如何匹配该节点


谢谢

如果将调用模板的结果保存在变量中,则可以使用XPath提取部分模板

<xsl:variable name="result">
  <xsl:call-template name="keywords"/>
</xsl:variable>
<xsl:sequence select="$keywords/test[1]" />

您可以使用Xpath表达式访问命名模板中的节点,如:

document('')/xsl:stylesheet/xsl:template[@name='keywords']/test[1]

添加了

例如,以下样式表:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <output>
        <xsl:copy-of select="document('')/xsl:stylesheet/xsl:template[@name='keywords']/test[1]"/>
    </output>
</xsl:template>

<xsl:template name="keywords">
    <test>
        <foo>bar</foo>
        <bar>foo</bar>
    </test>
    <test>
        <foo>foobar</foo>
        <bar>barfoo</bar>
    </test>
</xsl:template>

</xsl:stylesheet>

酒吧
福
福巴
巴福
应用于任何格式良好的XML输入时,将返回:

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <test xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <foo>bar</foo>
      <bar>foo</bar>
   </test>
</output>

酒吧
福

注意:通过应用模板而不是深度复制,可以消除(无害的)冗余命名空间声明。

为什么要将静态节点存储在模板中,而不是存储在变量或外部文档中?原始节点不是静态的,这只是一个例子,恐怕我无法想象这样做会有什么用处。我怀疑这是一个XY问题。你在这里的真正目的是什么?我在样式表的其他地方使用了一个相当大的模板。在我的文档的另一部分中,我想在不必要地重复codeIMHO的情况下加入一些节点,你应该用另一种方法:将重复部分单独放入一个变量中,并使用两次:一次在大模板中,一次在需要时单独使用。可以直接寻址模板的节点,即使不使用临时变量,也很尴尬。谢谢,这已经可以使用了@michael.hor257k不过,您的尴尬解决方案是什么?当然,您也可以将模板应用于变量中的节点。这是一种标准技术,有时被称为微管道。这给了我一个奇怪的错误:“URIResolver引发的异常”。。。“字符串索引超出范围:-1”。以前见过吗?你的测试环境是什么?这是一个Saxon进程,我不知道;它适用于我的Saxon 6.5和Saxon 8.9。您正在传递一个实际的XSLT文件吗?对不起,我不理解这个问题。但是无论如何,非常感谢你的耐心和帮助。您是否介意发布您的xml+xsl,我稍后会找出我的xml+xsl在哪里工作?