Xslt 匹配被调用模板的节点
假设我的xsl中有一个随机模板: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: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在哪里工作?