XSLT-код для получения только XML-записей с самой поздней датой - PullRequest
0 голосов
/ 22 января 2019

Это мой входной 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-код для сортировки, он работает, но я не знаю, как получить записи только с самой последней датой.

1 Ответ

0 голосов
/ 22 января 2019

Изменение

  <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:sort в xsl:apply-templates, а используйте его с xsl:for-each, и тогда вы можете непосредственно внутри него использовать <xsl:if test="position() = 1"><xsl:copy-of select="."/></xsl:if>.

...