XSLT - 如何确定元素是上下文中的最后一个

时间:2015-05-28 22:14:42

标签: xml xslt

我有以下XML:

<data>
    <item group="A">AAA</item>
    <item>DDD</item>
    <item group="B">BBB</item>
    <item>DDD</item>
</data>
<data>
    <item group="C">AAA</item>
    <item>DDD</item>
    <item group="D">BBB</item>
    <item>EEE</item>
</data>

我想在第二个“data”元素中的最后一个“item”元素返回“true”值。在这个例子中,我只有2个“数据”元素,但实际上,数据元素的数量是变化的。

这是我的XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:template match="data">
    <xsl:apply-templates select="item[@group]"/>
  </xsl:template>

  <xsl:template match="item">    
    <xsl:attribute name="lastdata">
      <xsl:if test="position() = last()">
        <xsl:value-of select="'true'"/>
      </xsl:if>
    </xsl:attribute>
 </xsl:template>

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您创建了lastdata属性,但没有创建任何元素。

<xsl:template match="item">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:attribute name="lastdata">
      <xsl:if test="position() = last()">
        <xsl:value-of select="'true'"/>
      </xsl:if>
    </xsl:attribute>
  </xsl:copy>
</xsl:template>

顺便说一句,您的XML示例不包含根元素,而您的XSL示例实际上根本不创建任何元素。

答案 1 :(得分:0)

XPath&#34; follow-sibling :: item&#34;询问&#34; item&#34;同一级别的标签。要测试&#34;数据&#34; parent是我们使用相同XPath选择器的最后一个。

我的输入XML文件:

<root>
  <data>
    <item group="A">AAA</item>
    <item>DDD</item>
    <item group="B">BBB</item>
    <item>DDD</item>
  </data>
  <data>
    <item group="C">AAA</item>
    <item>DDD</item>
    <item group="D">BBB</item>
    <item>EEE</item>
  </data>
</root>    

我使用样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="item[not(following-sibling::item)][parent::data[not(following-sibling::*)]]">
    <xsl:copy>
      <xsl:attribute name="lastdata">
        <xsl:value-of select="'true'"/>
      </xsl:attribute>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

得到结果:

<?xml version="1.0" encoding="UTF-8"?><root>
  <data>
    <item group="A">AAA</item>
    <item>DDD</item>
    <item group="B">BBB</item>
    <item>DDD</item>
  </data>
  <data>
    <item group="C">AAA</item>
    <item>DDD</item>
    <item group="D">BBB</item>
    <item lastdata="true">EEE</item>
  </data>
</root>