如何通过XSLT提取展示XML列表中decisions节点的最后一个item项
解决方案
不需要给decisions/item节点额外添加id属性用于排序,直接通过XPath内置的last()函数即可定位到最后一个item节点,修改方式如下:
方法1:修改模板匹配规则(推荐)
直接调整原有模板的match属性,仅匹配decisions下最后一个item内的费用项:
<xsl:template match="decisions/item[last()]/fees/item"> <xsl:if test="feeType/name != ''"> <xsl:value-of select="feeType/name"/> <xsl:choose> <xsl:when test="suggestedAmount > 0"> <xsl:text> </xsl:text><xsl:value-of select="suggestedAmount"/> </xsl:when> <xsl:otherwise> <xsl:if test="amount > 0"> <xsl:text> </xsl:text><xsl:value-of select="amount"/><xsl:text> </xsl:text><xsl:value-of select="currency/name"/> </xsl:if> <xsl:if test="percent > 0"> <xsl:text> </xsl:text><xsl:value-of select="percent"/><xsl:text> </xsl:text>% </xsl:if> </xsl:otherwise> </xsl:choose> </xsl:if> </xsl:template>
方法2:修改模板调用规则
如果你原有代码中是显式调用该模板,也可以直接调整apply-templates的选择范围,原有模板不需要修改:
<!-- 原有调用代码可能类似这样 --> <xsl:apply-templates select="decisions/item/fees/item"/> <!-- 修改为 --> <xsl:apply-templates select="decisions/item[last()]/fees/item"/>
原理说明
XPath的last()函数会返回当前上下文下同层级节点的总数量,item[last()]会按照XML文档内的节点先后顺序,选中同层级下的最后一个item节点,无论decisions下有1个还是多个item都可以正确生效。
内容的提问来源于stack exchange,提问作者Bellerephon
相关产品推荐
相关产品推荐

