我有以下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>
提前感谢您的帮助。
答案 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>