XSLT 1.0测试使用call-template传递的节点是父节点的最后一个节点

时间:2012-01-07 05:04:34

标签: xslt

<TEI>
    <text id="R">
    <text id="E">
    <text id="D">
</TEI>

如果我调用模板并将节点<text id="E">作为参数传递,那么在模板内执行的测试表达式将测试文本E是否是<TEI>个孩子的最后一个?< / p>

2 个答案:

答案 0 :(得分:2)

假设模板中参数的名称是元素,您可以通过检查元素是否有任何兄弟姐妹来实现此目的

<xsl:value-of select="not($element/following-sibling::*)" />

因此,给出以下XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/TEI">
    <xsl:call-template name="text">
      <xsl:with-param name="element" select="text[@id='E']"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="text">
    <xsl:param name="element" />
    <xsl:choose>
        <xsl:when test="not($element/following-sibling::*)">Last</xsl:when>
        <xsl:otherwise>Not Last</xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

应用于以下XML

<TEI> 
    <text id="R" /> 
    <text id="E" /> 
    <text id="D" /> 
</TEI> 

以下是输出

Not Last

将参数更改为 E 元素,而不是输出

Last

但是,如果可能,最好避免将 call-template 与参数一起使用。更好的设计模式是在这里使用 apply-templates

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/TEI">
    <xsl:apply-templates select="text[@id='D']" />
  </xsl:template>

  <xsl:template match="text[following-sibling::*]">
    <xsl:text>Not Last</xsl:text>
  </xsl:template>

  <xsl:template match="text">
    <xsl:text>Last</xsl:text>
  </xsl:template>
</xsl:stylesheet>

这也应该产生相同的结果

答案 1 :(得分:2)

  

如果我调用模板并将节点<text id="E">作为a传递   参数,在模板内执行的测试表达式   测试文本E是否是<TEI>的孩子中的最后一个?

我认为<TEI>的孩子是<TEI>元素 -children

如果是,请使用:

not($p/following-sibling::*[1])

以上可能比等效的更有效(如果XPath优化器不太智能):

not($p/following-sibling::*)

如果由<TEI>的孩子提出<TEI>的任意节点类型(文字,评论,PI和元素) - 孩子们,然后使用这个XPath表达式

not($p/following-sibling::node()[1])