匹配被叫模板的节点

时间:2014-10-27 17:46:58

标签: xslt xslt-2.0

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

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

我想输出让我们说只有第一个节点集。有一种优雅的方式来做到这一点? 如果节点不在源xml中,但如果是调用模板的结果,我该如何匹配节点?

谢谢!

2 个答案:

答案 0 :(得分:1)

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

提取部分模板
<xsl:variable name="result">
  <xsl:call-template name="keywords"/>
</xsl:variable>
<xsl:sequence select="$keywords/test[1]" />

答案 1 :(得分: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>

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