1

次のような行を含むxmlファイルがあります。

<Data>
    <a>something</a>
    <b>20120601</b>
    <c>something else</c>
</Data>

の値は、YYYYMMDD 形式の日付です

各行を処理する小さなテンプレートがあり、正常に動作しています (あまり機能しないため)。

ここで私の質問: B の日付が今日 (現在の日付) の 60 日前よりも大きい (後で) 場合にのみ、行を処理するにはどうすればよいですか? したがって、日付が最近の場合 -> 行を処理し、そうでない場合は処理しません。

4

3 に答える 3

2

完全で短くシンプルな XSLT 2.0 ソリューションを次に示します

<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:param name="pPeriod" select="'P60D'"/>

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

 <xsl:template match=
 "Data
   [current-date()
   -
    xs:date(concat(substring(b,1,4),
                   '-',
                   substring(b,5,2),
                   '-',
                   substring(b,7)
                   )
            )
    gt xs:dayTimeDuration($pPeriod)
   ]"/>
</xsl:stylesheet>

この XML ドキュメントに適用すると、次のようになります。

<t>
    <Data>
        <a>something</a>
        <b>20120601</b>
        <c>something else</c>
    </Data>
    <Data>
        <a>something</a>
        <b>20120420</b>
        <c>something else</c>
    </Data>
    <Data>
        <a>something</a>
        <b>20120301</b>
        <c>something else</c>
    </Data>
</t>

必要な正しい結果 (最後のData要素が「削除された」) が生成されます。

<t>
      <Data>
            <a>something</a>
            <b>20120601</b>
            <c>something else</c>
      </Data>
      <Data>
            <a>something</a>
            <b>20120420</b>
            <c>something else</c>
      </Data>
</t>
于 2012-06-09T02:06:02.923 に答える
0

コメンターが言ったように、XSL はそれ自体でこれを行うことはできません。最初に 60 日前の日付を調べ、これをパラメーターとして XSL に渡す必要があります。

PHP では、次の方法で 1 日を計算できます。

$date_60_days_ago = date('Y-m-d H:m:s', strtotime("-60 days"));

XSL については、この XMLPlayground セッションを参照してください (このデモのために手動で日付を渡します)。

http://www.xmlplayground.com/sK82Q4

于 2012-06-08T14:35:13.807 に答える
0

MiMo が既に述べたように、 xslt 1.0 には現在の日付を取得する組み込み関数はありません。パラメータを xslt スタイルシートに渡すことができますが、これは使用する xslt プロセッサによって異なります。

過去の日付 (現在の日付から 60 日を差し引いた日付) をパラメーターとして渡すと、テストは次のように簡単になります。

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

    <xsl:param name="backdate" />

    <xsl:template match="Data">
        <xsl:if test="(./b &gt;= $backdate)">
            <xsl:apply-templates />
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

xslt 2.0 では、組み込みcurrent-date()関数を使用できます

<xsl:variable name="backdate" select="current-date() -60*xs:dayTimeDuration('P1D')" />

...しかし、それに応じて日付値をキャストするか、日付値に合わせて変数を<b>フォーマットする必要があります。backdate

減算日に関する Dimitre の回答から採用。

于 2012-06-08T14:46:45.970 に答える