我正在使用xslt转换一些xml文件。我的输入数据如下所示:
<data>
<dataItem>
<value>24014</value>
<date>Feb 11, 2013</date>
</dataItem>
<dataItem>
<value>0</value>
<date>Feb 12, 2013</date>
</dataItem>
<dataItem>
<value>0</value>
<date>Feb 13, 2013</date>
</dataItem>
<dataItem>
<value>24627</value>
<date>Feb 14, 2013</date>
</dataItem>
<dataItem>
<value>0</value>
<date>Feb 15, 2013</date>
</dataItem>
</data>
我的输出数据需要如下所示:
<root>
<item>
<text>
Feb 14, 2013
</text>
</item>
</root>
换句话说,我正在寻找最新的日期元素,其中value元素不是0. dataItem元素保证按日期顺序递增(从文档顶部开始)。
我试图以递归的方式处理这个问题,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template name="findDate">
<xsl:param name="list"/>
<xsl:choose>
<xsl:when test="value = 0">
<xsl:call-template name="findDate">
<xsl:with-param name="list" select="$list[position()!=1]"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<root>
<item>
<text>
<xsl:value-of select="label"/>
</text>
</item>
</root>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="/">
<xsl:call-template name="findDate">
<xsl:with-param name="list" select="//dataItem"/>
</xsl:call-template>
</xsl:template>
</xsl:stylesheet>
到目前为止,它不起作用,而我所能解决的就是:
<root>
<item>
<text>
</text>
</item>
</root>
谁能看到我出错的地方?
谢谢,
保
答案 0 :(得分:3)
行<xsl:value-of select="label"/>
看起来很可疑,因为输入XML中没有label
个元素。
但是不需要递归模板。请尝试以下方法:
<xsl:template match="/">
<root>
<xsl:apply-templates select="data/dataItem[value!=0][last()]"/>
</root>
</xsl:template>
<xsl:template match="dataItem">
<item>
<text>
<xsl:value-of select="date"/>
</text>
</item>
</xsl:template>
答案 1 :(得分:2)
如果dataItem
元素已经按date
排序,您应该只能抓住没有dataItme
值的最后0
。 (查看XP xsl:apply-temlates
模板中的/*
以执行此操作。)
XML输入
<data>
<dataItem>
<value>24014</value>
<date>Feb 11, 2013</date>
</dataItem>
<dataItem>
<value>0</value>
<date>Feb 12, 2013</date>
</dataItem>
<dataItem>
<value>0</value>
<date>Feb 13, 2013</date>
</dataItem>
<dataItem>
<value>24627</value>
<date>Feb 14, 2013</date>
</dataItem>
<dataItem>
<value>0</value>
<date>Feb 15, 2013</date>
</dataItem>
</data>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<root>
<xsl:apply-templates select="(dataItem[not(value=0)])[last()]"/>
</root>
</xsl:template>
<xsl:template match="dataItem">
<item>
<xsl:apply-templates/>
</item>
</xsl:template>
<xsl:template match="date">
<text><xsl:value-of select="."/></text>
</xsl:template>
<xsl:template match="value"/>
</xsl:stylesheet>
XML输出
<root>
<item>
<text>Feb 14, 2013</text>
</item>
</root>