这是我的输入xml,我只需要获取每个personId的最新日期的记录:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Root>
<Emp>
<PersonId>10001</PersonId>
<Child>
<F1>JOE DOE</F1>
<F2>SGP</F2>
<F3>2010-01-06</F3>
<F4>10001</F4>
</Child>
<Child>
<F1>Chris Tiu</F1>
<F2>SGP</F2>
<F3>2012-01-26</F3>
<F4>10001</F4>
</Child>
</Emp>
<Emp>
<PersonId>10653</PersonId>
<Child>
<F1>Test Child</F1>
<F2>SGP</F2>
<F3>2008-11-29</F3>
<F4>10653</F4>
</Child>
<Child>
<F1>jane doe</F1>
<F2>SGP</F2>
<F3>1994-01-05</F3>
<F4>10653</F4>
</Child>
</Emp>
</Root>
我已经有了排序逻辑,我正在寻找一种从 xml 中删除旧记录的方法。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="cp1252" />
<xsl:template match="/Root/Emp">
<xsl:copy>
<xsl:apply-templates select="Child">
<!-- concat year, month, day -->
<xsl:sort order="descending" select="concat(substring(F3, 1, 4), substring(F3, 6, 2), substring(F3, 9, 2))" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这是我用于排序的 xsl 代码,它可以工作,但我不知道如何只获取具有最新日期的记录。
更改
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
自
<xsl:template match="@* | node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
将允许您添加
<xsl:template match="Child">
<xsl:if test="position() = 1">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:template>
或者不要在xsl:apply-templates
中使用xsl:sort
,而是将其与xsl:for-each
一起使用,然后您可以直接在其中使用 <xsl:if test="position() = 1"><xsl:copy-of select="."/></xsl:if>
。