2017-06-06 19 views
0

私はいくつかの非常によく似た質問を見ましたが、解決策は私の場合は機能しないようです。一連のデータから最初の行を取得するXSLT

私はこのようなXMLを持っています。

<AdLocInfo> 
      <ExternalRunSchedNumber/> 
      <RunSchedule-id>280896</RunSchedule-id> 
      <publication-id>181</publication-id> 
      <publication>SWEB</publication> 
      <publication-placement-id>10</publication-placement-id> 
      <publication-placement>Legals</publication-placement> 
      <publication-position-id>21</publication-position-id> 
      <publication-position>Legal - Notices</publication-position> 
      <import-price>0.00</import-price> 
      <rundates> 
       <date Insertion-id="1530082" InvoicedAlreadyFlag="true" PublishedFlag="true" Deadline="05042017 15:30:00">05062017</date> 
       <date Insertion-id="1530083" InvoicedAlreadyFlag="true" PublishedFlag="true" Deadline="05052017 15:30:00">05072017</date> 
       <date Insertion-id="1530084" InvoicedAlreadyFlag="true" PublishedFlag="true" Deadline="05052017 15:30:00">05082017</date> 
       <date Insertion-id="1530085" InvoicedAlreadyFlag="true" PublishedFlag="true" Deadline="05082017 15:30:00">05092017</date> 
       <date Insertion-id="1530086" InvoicedAlreadyFlag="true" PublishedFlag="true" Deadline="05092017 15:30:00">05102017</date> 
       <date Insertion-id="1530087" InvoicedAlreadyFlag="true" PublishedFlag="true" Deadline="05102017 15:30:00">05112017</date> 
       <date Insertion-id="1530088" InvoicedAlreadyFlag="true" PublishedFlag="true" Deadline="05112017 15:30:00">05122017</date> 
       <date Insertion-id="1530089" InvoicedAlreadyFlag="true" PublishedFlag="true" Deadline="05112017 15:30:00">05132017</date> 
       <date Insertion-id="1530090" InvoicedAlreadyFlag="true" PublishedFlag="true" Deadline="05122017 15:30:00">05142017</date> 
       <date Insertion-id="1530091" InvoicedAlreadyFlag="true" PublishedFlag="true" Deadline="05122017 15:30:00">05152017</date> 

私はシリーズの最初と最後の日付を取りたいと思います。

私のXSLは、次のようになります。

<xsl:for-each select="AdBaseInfo"> 
     <ad> 
      <paperId>5344</paperId> 
      <paperItemId> 
       <xsl:value-of select="Ad/AdNumber"/> 
      </paperItemId> 
      <itemDesc> 
       <!--<xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>--> 
       <xsl:value-of select="Ad/ad-content"/> 
       <!--<xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>--> 
      </itemDesc> 
      <startDate> 
       <xsl:for-each select="//date[1]"> 
        <xsl:value-of select="concat(substring(., 5, 4), '-', substring(., 1, 2), '-', substring(., 3, 2))" /> 
       </xsl:for-each> 
      </startDate> 

しかし、それは、XMLファイルの各レコードから最初の行になります。

<ad> 
<paperId>5344</paperId> 
<paperItemId>0000119016-01</paperItemId> 
<itemDesc/> 
<startDate>2017-05-062017-05-242017-06-012017-06-012017-06-082017-05-272017-06-082017-06-082017-06-072017-06-072017-06-082017-06-082017-07-012017-06-082017-06-082017-06-072017-06-082017-06-10</startDate> 
<expDate/> 
<categoryId>S-Main Legal ROP</categoryId> 

ご協力いただければ幸いです。

答えて

0

date要素(dates)、 のソート済みリストの作成を開始する必要がありますが、通常のコピーでは開始できません。

この変数の内容は、内部 sort命令、処理date要素とfor-eachループで作成されます。

ソート順は年月日です。

ループの各ターンはdates変数新しいdateノード、ちょうど日付(テキストノード)と が、適切な(ターゲット)の形式でに追加します。

さらに何か必要な場合は、新しく作成された要素 にコピーしてください。あなたが必要とする属性。心の中で上記で

、私はノードのリストではなく、文字列だけのリストを作成することを選択しました。

あなたがminまたはmaxの日付を取得したい場合はその後、書くのに十分です:

  • <xsl:value-of select="$dates/date[1]"/>または
  • 以下
  • <xsl:value-of select="$dates/date[last()]"/>

完全なスクリプトはあなたのために働いて、そこにありますサンプル入力。

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

    <xsl:template match="rundates"> 
    <xsl:copy> 
     <xsl:variable name="dates"> 
     <xsl:for-each select="date"> 
      <xsl:sort select="concat(substring(., 5, 4), 
      '-', substring(., 1, 2), '-', substring(., 3, 2))"/> 
      <date> 
      <xsl:value-of select="concat(substring(., 5, 4), 
       '-', substring(., 1, 2), '-', substring(., 3, 2))" /> 
      </date> 
     </xsl:for-each> 
     </xsl:variable> 
     <minDate> 
     <xsl:value-of select="$dates/date[1]"/> 
     </minDate> 
     <maxDate> 
     <xsl:value-of select="$dates/date[last()]"/> 
     </maxDate> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="AdLocInfo"> 
    <xsl:apply-templates select="rundates"/> 
    </xsl:template> 
</xsl:transform> 
関連する問題