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