Autor Zpráva
Stewe
Profil *
Ahoj, řeším problém s exportem Datumu z MS access. Export do XMl má vždy formát yyyy-mm-ddT:00:00:00

Chci se té poslední části zbyvit a asi poslední možnost je XSL.
Jen opravdu nemám tušení co a jak, všude jsou návody na transformaci do html ale já chci jen upravit xml.

Mohl by mi tu někdo ukázat na jednom příkladu jak na to?

Vstupní xml
<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2015-05-19T11:55:48">
<VYMENA>
<CISLO>E1084</CISLO>
<DATUM>2015-01-01T00:00:00</DATUM>
</VYMENA>

Výstup by měl být stejný jen místo 2015-01-01T00:00:00 bude 2015-01-01.

Děkuji za nějaký příklad, mělo by mi to stačit abych se chytl.
juriad
Profil
Stewe:
Je to celé XML? Chybí tam zabírací značka elementu dataroot.

Inspiruj se tady:
stackoverflow.com/questions/487779/xslt-transformation-datetime-to-date-format

Tvá transformace by vypadala:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"/>

    <!-- kopíruje, pokud není jiné lepší pravidlo -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- uřeže časovou čast DateTime -->
    <xsl:template name="FormatDate">
        <xsl:param name="DateTime" />
        <xsl:variable name="date">
                <xsl:value-of select="substring-before($DateTime,'T')" />
        </xsl:variable>

        <xsl:if test="string-length($date) != 10">
                <xsl:value-of select="$DateTime"/>
        </xsl:if>
        <xsl:if test="string-length($date) = 10">
                <xsl:value-of select="$date"/>
        </xsl:if>
    </xsl:template>

    <!-- pravidlo pro element DATUM; je přesnější než to obecné nahoře, proto se uplatní -->
    <xsl:template match="DATUM">
        <xsl:copy>
            <xsl:call-template name="FormatDate">
                <xsl:with-param name="DateTime" select="."/>
            </xsl:call-template>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
Stewe
Profil *
S malou upravou...
Funguje mi toto
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="*">
    <xsl:param name="parentElm">
        <xsl:value-of select="name(..)" />
    </xsl:param>
    <xsl:choose>
        <xsl:when test="local-name() = 'DATUM'">
            <xsl:element name="DATUM">
                <xsl:call-template name="FormatDate">
                    <xsl:with-param name="DateTime" select="."/>
                </xsl:call-template>
            </xsl:element>
        </xsl:when>
        <xsl:otherwise>
            <xsl:element name="{local-name()}">
                <xsl:copy-of select="@*" />
                <xsl:apply-templates select="@* | node()" />
            </xsl:element>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template name="FormatDate">
    <xsl:param name="DateTime" />
    <xsl:variable name="date">
        <xsl:value-of select="substring-before($DateTime,'T')" />
    </xsl:variable>

    <xsl:if test="string-length($date) != 10">
        <xsl:value-of select="$DateTime"/>
    </xsl:if>
    <xsl:if test="string-length($date) = 10">
        <xsl:value-of select="$date"/>
    </xsl:if>
</xsl:template>
</xsl:stylesheet>
Stewe
Profil *
Chci se ještě zeptat. Sice funguje ale nejsem schopen ho rozšířit na dva různé sloupce. Vždy mi zpracuje jen poslední zadaný sloupec.

Mohl by mi někdo poradit, jak udělat aby script zpracoval jiné sloupce?

Jednoduše jsem nakopíroval kod a změnil adresy a názvy proměných ale to nefunguje.
Stewe
Profil *
Tak už mám lepší kod který funguje nakonec se ta transformace dá udělat uplně snadno :)

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="SERIE | DATUM1 | DATUM2 | K46">
    <xsl:copy>
        <xsl:value-of select="substring-before(.,'T')" />
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: