2

xs:date を使用する場合、XSD/XML 内で YYYY-MM-DD としてレイアウトする必要があることがわかっているため、XML から XSLT 1.0 にプルしたときにテキストを DD-MM-YYYY として表示するようにフォーマットしようとしています。使用済み。

これが私が取り組んでいるコードです。これをどのように表示すべきかについてのアドバイスはありますか?

XML

<?xml version="1.0" encoding="ISO-8859-1"?>
<events xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="events.xsd">
  <venue id="01" 
         vtitle="ExCeL Exhibition Centre" 
         location="London" 
         telephone="0844 448 7600">
   <event name="Doctor Who 50th Celebration" date="2013-10-22">
    <image>images/doctor50.jpg</image><attribute>Doctor Who Event</attribute>
    <description>A 50th Anniversary musical bonanza for Doctor Who.</description>
    <ticket_price type="adult" status="available">&#163;25.00</ticket_price>
    <ticket_price type="child" status="none">&#163;11.00</ticket_price>
    <ticket_price type="junior" status="available">&#163;0.00</ticket_price>
    <email>info@roundhouselondon.com</email>
</event>
</venue>

XSD

<xs:attribute name="date" type="xs:date"/>

XSLT

<xsl:element name="date"><xsl:value-of select="@date"/></xsl:element>

HTML

<date>2013-10-22</date>
4

5 に答える 5

4

1.0 と 2.0 の両方で @Stormtroopr が提供するソリューションとは異なるソリューションを使用します。

2.0で使用

format-date(xs:date($date), '[D01]-[M01]-[Y0001]')

1.0使用時

concat(substring(., 9, 2), 
         '-', 
         substring(., 6, 2), 
         '-', 
         substring(., 1, 4))

今後の参考のために、使用している XSLT のバージョンをお知らせください。1.0 と 2.0 の両方が一般的に使用されており、ソリューションが異なることがよくあります。

于 2013-11-04T09:08:36.847 に答える
1

SharePointに使用していますが、このように解決しました

<xsl:value-of select=" ddwrt:FormatDate(/dsQueryResponse/Rows/Row/@Date,3,1)"/>
于 2014-06-04T11:34:45.737 に答える
0

XSLT 2.0 では、tokenize を使用して文字列を分割し、and を使用xsl:for-eachxsl:sortて逆にすることができます。(私は現在 XSLT2.0 エンジンを持っていませんが、これはあなたが必要とするものにかなり近いものです)。

<xsl:for-each select="tokenize(@date,'-'">
    <xsl:sort select="position()" data-type="number" order="descending"/>
    <xsl:value-of select="."/>
</xsl:for-each>

XSLT 1.0 では、再帰を使用してそれを行います。

これが要点です。これは日付を取得し、最初のハイフン ( ) の前後の文字列を検索します-。通常、順序を維持するためsubstring-beforeに の処理の後に来る必要がありますsubtring-afterが、ここではそれらを切り替えて、最終的に出力を逆にします。

<xsl:template name="reverse-date">
    <xsl:param name="text" select="."/>
    <xsl:choose>
        <xsl:when test="contains($text, '-')">
            <xsl:call-template name="reverse-date">
                <xsl:with-param name="text" select="substring-after($text, '-')"/>
            </xsl:call-template>
            <xsl:text>-</xsl:text>
            <xsl:value-of select="substring-before($text, '-')" />
        </xsl:when>
        <xsl:otherwise>
           <xsl:value-of select="$text"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

以下は、上記の XML ドキュメントに基づいて日付を逆にする完全なテンプレートです。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <xsl:apply-templates select="//event"/>
</xsl:template>

<xsl:template match="event">
  <xsl:element name="date">
    <!--
         ** Call this template when you want to reverse the date **
    -->
    <xsl:call-template name="reverse-date">
     <xsl:with-param name="text" select="@date" />
    </xsl:call-template>
  </xsl:element>
</xsl:template>

<xsl:template name="reverse-date">
    <xsl:param name="text" select="."/>
    <xsl:choose>
        <xsl:when test="contains($text, '-')">
           <xsl:value-of select="substring-before($text, '-')" />
            <xsl:text>-</xsl:text>
            <xsl:call-template name="reverse-date">
                <xsl:with-param name="text" select="substring-after($text, '-')"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
           <xsl:value-of select="normalize-space($text)"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>

あなたのコードで

これを変更する必要があります:

<xsl:element name="date"><xsl:value-of select="@date"/></xsl:element>

これに:

<xsl:element name="date">
  <xsl:call-template name="reverse-date">
    <xsl:with-param name="text" select="@date" />
  </xsl:call-template>
</xsl:element>
于 2013-11-03T23:20:02.543 に答える
-1

このコードはおそらく役立ちます:

    for children in child:
        if children.tag  == "dateTime":
            list_dateTime = [children.text] 
            lista=list_dateTime             
            simbolo=('/')
            simboloh=(':')            
            Lis=str(lista)
            dd=Lis[2:4]
            mm=Lis[4:6]
            yy=Lis[6:10]
            hh=Lis[10:12]
            mms=Lis[12:14]
            data=dd + simbolo + mm+  simbolo + yy+  simbolo +hh+ simboloh + mms
        if children.tag == "field":
            for subchildren in children:
                if subchildren.tag == "id":
                    list_id = [subchildren.text]
                if subchildren.tag =="value":
                    list_value = [subchildren.text]
                    arquivo.writelines('\n')
                    arquivo.writelines(list_period)
                    arquivo.writelines(',')
                    arquivo.writelines(data)
                    arquivo.writelines(',')
                    arquivo.writelines(list_id)
                    arquivo.writelines(',')
                    arquivo.writelines(list_value)
于 2021-06-15T14:03:59.133 に答える