Мне нужно отсортировать по дате и времени, и я хочу только самое последнее содержимое этого узла - PullRequest
1 голос
/ 08 апреля 2011
<Note NoteText="TestOrder">
    <test City="abc" Address="abc"
          Response="abc" Devicename="abc"
          DateTime="2011-02-07T07:02:53+00:00"/>
</Note>
<Note NoteText="TestOrder1">
    <test City="abc" Address="abc"
          Response="abc" Devicename="abc"
          DateTime="2011-02-08T07:02:53+00:00"/>
</Note>
<Note NoteText="TestOrder2">
    <test City="abc" Address="abc"
          Response="abc" Devicename="abc"
          DateTime="2011-02-09T18:02:53+00:00"/>
</Note>
<Note NoteText="TestOrder3">
    <test City="abc" Address="abc"
          Response="abc" Devicename="abc"
          DateTime="2011-02-10T17:02:53+00:00"/>
</Note>

Здесь сначала я хочу найти самый последний атрибут Datetime from Datetime, и я хочу перенести эти последние атрибуты в другой атрибут, используя xslt.

city-C1
Address-A1
Response-R1
Devicename-D1
Datetime-DT

Пожалуйста, помогите мне продолжить

Ответы [ 2 ]

1 голос
/ 08 апреля 2011

Таблица стилей XSLT 1.0:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="vMax">
        <xsl:for-each select="/*/Note/test/@DateTime">
            <xsl:sort order="descending"/>
            <xsl:if test="position()=1">
                <xsl:value-of select="generate-id(..)"/>
            </xsl:if>
        </xsl:for-each>
    </xsl:variable>
    <xsl:template match="test">
        <xsl:if test="generate-id()=$vMax">
            <test C1="{@City}"
                  A1="{@Address}"
                  R1="{@Response}"
                  D1="{@Devicename}"
                  DT="{@DateTime}"/>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

Вывод:

<test C1="abc" A1="abc" R1="abc" D1="abc" DT="2011-02-10T17:02:53+00:00" />

Примечание : Работает, если нет другого часового пояса.

1 голос
/ 08 апреля 2011

Это преобразование :

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:variable name="vLatest" select=
     "max(/*/*/test/@DateTime/xs:dateTime(.))"/>

 <xsl:template match=
   "test[xs:dateTime(@DateTime) eq $vLatest]">
     <maxTest>
       <xsl:copy-of select="@*"/>
     </maxTest>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML:

<notes>
   <Note NoteText="TestOrder">
                <test City="abc" Address="abc" Response="abc" Devicename="abc"
                DateTime="2011-02-07T07:02:53+00:00"/>
    </Note>
    <Note NoteText="TestOrder1">
                <test City="abc" Address="abc" Response="abc" Devicename="abc"
                DateTime="2011-02-08T07:02:53+00:00"/>
    </Note>
    <Note NoteText="TestOrder2">
                <test City="abc" Address="abc" Response="abc" Devicename="abc"
                DateTime="2011-02-09T18:02:53+00:00"/>
    </Note>
    <Note NoteText="TestOrder3">
                <test City="abc" Address="abc" Response="abc" Devicename="abc"
                DateTime="2011-02-10T17:02:53+00:00"/>
    </Note>
</notes>

создает искомый, правильный результат:

<maxTest xmlns:xs="http://www.w3.org/2001/XMLSchema" City="abc" Address="abc"
         Response="abc"
         Devicename="abc"
         DateTime="2011-02-10T17:02:53+00:00"/>
...