2

XML ファイルを取得する際に問題が発生しています。サンプルから、取得している日付の形式が でmm/dd/yyyyあり、場合によってはm/d/yyyy. 私の仕事は、これを、スキーマが .xml のみを受け入れる別の XML ファイルに変換することですyyyy-mm-dd。XSLT 1.0/XPATH 1.0 の使用に制限されています。これどうやってするの?

4

2 に答える 2

8

あなたの質問は少し漠然としています。いくつかのサンプル入力と期待される出力が必要です。しかし、とにかく、ここにあなたが望むものを最もよく推測するための答えがあります.

この入力を考えると:

<?xml version="1.0"?>
<dates>
  <date>11/12/2012</date>
  <date>3/4/2011</date>
</dates>

... このスタイルシートによって変換された ...

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

      <xsl:template match="dates">
        <xsl:copy>
        <xsl:apply-templates select="*" />
        </xsl:copy>
      </xsl:template>

      <xsl:template match="date">
        <xsl:copy>
        <xsl:value-of select=" 
           concat(
           substring-after(substring-after(.,'/'),'/') , '-',
           format-number( number( substring-before(.,'/')), '00') , '-',
           format-number( substring-before(substring-after(.,'/'),'/'), '00') 
           )
          " />
        </xsl:copy>
      </xsl:template>

</xsl:stylesheet>

...この目的の出力が生成されます...

<dates>
 <date>2012-11-12</date>
 <date>2011-03-04</date>
</dates>

正しい場合は、答えにチェックを入れてください。このソリューションをhttp://www.purplegene.com/static/transform.htmlで確認しました

于 2012-04-30T15:34:00.593 に答える
1

以下に示す私の XSLT は動作するはずです。ハードコーディングされた長さやインデックスは使用しませんが、代わりに日付文字列を「/」で分割して、日、月、年のコンポーネントがどこにあるかを調べます。

XSLT:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" />

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

        <!-- match the date and invoke formatDate to format it -->
    <xsl:template match="date">
        <xsl:element name="date">
            <xsl:call-template name="formatDate">
                <xsl:with-param name="dateParam" select="." />
            </xsl:call-template>
        </xsl:element>
    </xsl:template>

    <xsl:template name="formatDate">
        <xsl:param name="dateParam" />
        <!-- input format mm/dd/yyyy or m/d/yyyy -->
        <!-- output format yyyy-mm-dd -->


        <!-- parse out the day, month and year -->
        <xsl:variable name="month" select="substring-before($dateParam,'/')" />
        <xsl:variable name="day" select="substring-before(substring-after($dateParam,'/'),'/')" />
        <xsl:variable name="year" select="substring-after(substring-after($dateParam,'/'),'/')" />

        <!-- now print them out. Pad with 0 where necessary. -->
        <xsl:value-of select="$year" />
        <xsl:value-of select="'-'" />
        <xsl:if test="string-length($month) = 1">
            <xsl:value-of select="'0'" />
        </xsl:if>
        <xsl:value-of select="$month" />
        <xsl:value-of select="'-'" />
        <xsl:if test="string-length($day) = 1">
            <xsl:value-of select="'0'" />
        </xsl:if>
        <xsl:value-of select="$day" />
    </xsl:template>

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

</xsl:stylesheet>

入力:

<input>
    <date>04/30/2012</date>
    <date>4/1/2012</date>
</input>

出力:

<?xml version="1.0" encoding="UTF-8"?>
<input>
    <date>2012-04-30</date>
    <date>2012-04-01</date>
</input>

デモ: http://www.xsltcake.com/slices/kBveVQ

于 2012-04-30T15:26:59.943 に答える