XSLT 代码,用于仅获取具有最新日期的 XML 记录



这是我的输入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>

相关内容

  • 没有找到相关文章

最新更新