2013-03-07 62 views
0

我想從XML源提取最小和最大日期。我得到一個nodeset到我的變量中,並且我需要節點內的實際日期值,並且找不到如何獲取它。XSL Transform提取最小和最大日期

源XML:

<Info dataSource="source"> 
<Detail> 
    <StartDate>20121211</StartDate> 
    <EndDate>20130112</EndDate> 
</Detail> 
<Detail> 
    <StartDate>20121211</StartDate> 
    <EndDate>20130112</EndDate> 
</Detail> 
<Detail> 
    <StartDate>20121211</StartDate> 
    <EndDate>20130112</EndDate> 
</Detail> 
<Detail> 
    <StartDate>20121218</StartDate> 
    <EndDate>20130114</EndDate> 
</Detail> 
</Info> 

的XSL代碼:

<xsl:if test="//StartDate != '' and //EndDate != ''"> 
    <xsl:variable name ="startDate"> 
     <xsl:for-each select="//StartDate"> 
     <xsl:sort select="StartDate" data-type="text" order="ascending"/> 
     <xsl:if test="position() = 1"> 
      <xsl:value-of select="." /> 
     </xsl:if> 
     </xsl:for-each> 
    </xsl:variable> 
    <xsl:variable name ="endDate"> 
     <xsl:for-each select="//EndDate"> 
     <xsl:sort select="EndDate" data-type="text" order="descending"/> 
     <xsl:if test="position() = 1"> 
      <xsl:value-of select="." /> 
     </xsl:if> 
     </xsl:for-each> 
    </xsl:variable> 
    </xsl:if> 

的日期格式正確無誤,支持排序和檢索,問題是一旦變量填充我無法找到如何訪問它們的值:

+0

這一切都設置爲獲取兩個值之間的差異,即期間的日期。 – Rick 2013-03-07 19:01:27

回答

0

如果您使用的是XSLT 2.0,您可以使用minmax函數來爲您工作。 XSLT 1.0不具備這些功能,但是你可以通過這樣騙(可能是相當低效的大投入,但它的工作原理):

<xsl:variable name="startDate" select="string(//StartDate[not(. > //StartDate)])" /> 

,同樣的結束日期。這裏的訣竅是您正在尋找StartDate ,其中沒有其他StartDate 大於。

+0

謝謝,伊恩。我應該指定,這是XSLT 1.0。 – Rick 2013-03-07 19:48:40

+0

輸入不會太大,我從這個示例數據中抽取的完整文件只有339行,並且大多數情況下會有1-4個servicePeriod日期實例。你是一個很好的例子/想法,但我正在用一個空字符串。 DOH,我需要更新名稱,懶惰..... – Rick 2013-03-07 21:18:34

+0

謝謝,伊恩!不同的角度,我關閉和運行... – Rick 2013-03-07 22:12:57