2016-10-18 8 views
0

と交換して、私はXSLTでトリッキーな要件を持っているはXSLTでユリウス日付を比較して、高い

入力XMLは、私の要件は、それらが同じであるならば、 を取り、同じ注文番号を確認するためである

<Orders> 
    <Order> 
     <OrderNumber>100</OrderNumber> 
     <Date>116256</Date> 
    </Order> 
    <Order> 
     <OrderNumber>101</OrderNumber> 
     <Date>116257</Date> 
    </Order> 
    <Order> 
     <OrderNumber>102</OrderNumber> 
     <Date>116286</Date> 
    </Order> 
    <Order> 
     <OrderNumber>102</OrderNumber> 
     <Date>116276</Date> 
    </Order>  
</Orders> 

を下回っています私の場合はジュリアン形式でより高い日付ですので、私はちょうど より高い数字を取らなければなりません。

出力XMLは次のようになります。

<Orders> 
    <Order> 
     <OrderNumber>100</OrderNumber> 
     <Date>116256</Date> 
    </Order> 
    <Order> 
     <OrderNumber>101</OrderNumber> 
     <Date>116257</Date> 
    </Order> 
    <Order> 
     <OrderNumber>102</OrderNumber> 
     <Date>116286</Date> 
    </Order> 
    <Order> 
     <OrderNumber>102</OrderNumber> 
     <Date>116286</Date> 
    </Order>  
</Orders> 

おかげ Yatan

+0

はあなたの出力は、入力と同じであるように思われます。あなたの説明で判断すると、これは*グループ化の質問です。検索を行う - おそらく最も頻繁に質問されるXSLTの質問です。 XSLT 1.0または2.0では答えが異なることに注意してください。 –

+0

HI Michael、出力XMLでは、最後の2つの注文は同じ注文番号であるため、日付の列はより高い日付の – Yatan

+0

に変更されています。お使いのプロセッサはXSLT 2.0をサポートしていますか? –

答えて

0

ここにあなたがそれを見ることができる一つの方法です:

XSLT 2.0

<xsl:stylesheet version="2.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="*"/> 

<xsl:key name="order-by-number" match="Order" use="OrderNumber" /> 

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

<xsl:template match="Date"> 
    <xsl:copy> 
     <xsl:value-of select="max(key('order-by-number', ../OrderNumber)/Date)"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

マイケルありがとう、これは動作します。 – Yatan

+0

良いところで、「日付」は「116286」のどのような種類ですか?それはジュリアンじゃない。 –

+0

ちょうどそのように私はいくつかの番号を入れた。 – Yatan