2009-04-23 103 views
1

鑑於這種XML:的XPath選擇屬性

<?xml version="1.0" encoding="utf-8"?> 
<content dataType="XML"> 
    <item type="Promotion" name="Sample Promotion" expires="04/01/2009"> 
    <![CDATA[ 
     <p>Details here.</p> 
    ]]> 
    </item> 
    <item type="Promotion" name="Sample Promotion 2" expires="05/01/2009"> 
    <![CDATA[ 
     <p>Details here.</p> 
    ]]> 
    </item> 
</content> 

什麼會中的XPath是選擇尚未過期的項目?

回答

2

的過期<item>元件可以通過一個單一的XPath表達式被選擇,所提供的當前日期被提供 - 無論是在一個變量中,或作爲文字串。

以下解決方案使用XSLT 1.0作爲XPath 1.0的主機語言

爲方便起見,當前日期指定作爲全球<xsl:param>參數,命名爲pToday

另一個方便之處在於當前的年,月,日的值的變量$vthisYear$vthisMonth$vthisDay定義。如有必要,可將這些變量引用替換爲XPath表達式中右側的定義。

的通緝單XPath表達式被包裹式在下面的XSLT轉換:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes" 
    cdata-section-elements="item"/> 


<xsl:param name="pToday" select="'04/23/2009'"/> 

<xsl:variable name="vthisDay" select= 
    "substring($pToday,4,2)"/> 

<xsl:variable name="vthisMonth" select= 
    "substring($pToday,1,2)"/> 

<xsl:variable name="vthisYear" select= 
    "substring($pToday,7)"/> 

    <xsl:template match="/"> 
    <nonExpired> 
      <xsl:copy-of select= 
      "/*/item 
       [$vthisYear &lt; substring(@expires,7) 
       or 
        ($vthisYear = substring(@expires,7) 
       and 
        $vthisMonth &lt; substring(@expires,1,2) 
        ) 
      or 
        ($vthisYear = substring(@expires,7) 
       and 
        $vthisMonth = substring(@expires,1,2) 
       and 
        $vthisDay &lt;= substring(@expires,4,2) 
        ) 
       ] 

      "/> 
     </nonExpired> 
    </xsl:template> 
</xsl:stylesheet> 

當上述變換所提供的XML文檔施加:

<content dataType="XML"> 
    <item type="Promotion" name="Sample Promotion" expires="04/01/2009"><![CDATA[  <p>Details here.</p> ]]></item> 
    <item type="Promotion" name="Sample Promotion 2" expires="05/01/2009"><![CDATA[  <p>Details here.</p> ]]></item> 
</content> 

的通緝結果產生

<nonExpired> 
    <item type="Promotion" name="Sample Promotion 2" expires="05/01/2009"><![CDATA[  <p>Details here.</p> ]]></item> 
</nonExpired> 

注意oneporter的解決方案也將工作,只要其中的一些小錯誤得到糾正。此外,它需要返工,因爲它不切實際地期望當前日期將以與@expires屬性中的日期不同的格式提供。

0

XPath不理解日期格式,因此您需要使用擴展函數來完成此項工作。

或者,您可以使用子字符串來提取該屬性的各個部分。如果屬性沒有完全格式化,則會遇到問題,並且表達式會變得很大。

1

我是新來的XSLT,但如果你使用1.0或1.1,我會得到從什麼地方當前日期然後比較這兩個字符串。 page描述了一個用於提取日期的dos和* nix方法。然後讓他們可比我可能會重組值(我假設$ CURRENT_DATE是YYYYMMDD格式的字符串)

<xsl:if test="number(concat(substring(.[@expires],5,4), 
    substring(.[@expires],3,2),substring(.[@expires],1,2))&lt;number(
    $current_date"> 
... 
</xsl> 

但是就像我說的,我剛開始使用XSL。所以,對於一個簡單的問題,這可能是一個非常笨重的解決方案。