2012-11-02 44 views
3

我有下面的XML:XPath查詢比較的結果是數值範圍內

<items> 
    <item> 
     <locations> 
      <location> 
       <latitude>-100</latitude> 
       <longitude>10</longitude> 
      </location> 
      <location> 
       <latitude>10</latitude> 
       <longitude>10</longitude> 
      </location> 
     </locations> 
    </item> 
    <item> 
     <locations> 
      <location> 
       <latitude>10</latitude> 
       <longitude>10</longitude> 
      </location> 
      <location> 
       <latitude>10</latitude> 
       <longitude>10</longitude> 
      </location> 
     </locations> 
    </item> 
<items> 

我需要數與緯度或經度無效值的項目。

有效的緯度爲-90°和90°之間有效經度爲-180和180

之間爲了便於後期的,我們只是設法得到它算緯度比-90更高。

我曾嘗試以下,其中沒有工作:

count(//item[locations/location[number(latitude) &gt; -90]) 
count(//item[locations/location[number(latitude)] &gt; -90) 
count(//item[locations/location/*[number(latitude) &gt; -90]) 
count(//item[locations/location/*[number(latitude)] &gt; -90) 
count(//item[locations/location/*[number(name() = latitude)] &gt; -90) 
count(//item[locations/location/*number([name() = latitude]) &gt; -90) 
count(//item[number(deal/locations/location/*[name()=latitude]) &gt; -90]) 

有誰知道這是否可能?如果不是,任何人都可以想到一個整潔的解決方法?

謝謝大家提前。

回答

1

我認爲你需要使用小於,不大於 - 你想要緯度小於 -90。

例如運行這個XSLT

<xsl:template match="/"> 
    <GoodItems> 
     <xsl:value-of select="count(//item[not(locations/location[number(latitude) &lt; -90 
                  or number(latitude) &gt; 90 
                  or number(longitude) &lt; -180 
                  or number(longitude) &gt; 180])])" /> 
    </GoodItems> 
    <LatTooSmall> 
     <xsl:value-of select="count(//item[locations/location[number(latitude) &lt; -90]])" /> 
    </LatTooSmall> 
    <LatTooBig> 
     <xsl:value-of select="count(//item[locations/location[number(latitude) &gt; 90]])" /> 
    </LatTooBig> 
    <LongTooSmall> 
     <xsl:value-of select="count(//item[locations/location[number(longitude) &lt; -180]])" /> 
    </LongTooSmall> 
    <LongTooBig> 
     <xsl:value-of select="count(//item[locations/location[number(longitude) &gt; 180]])" /> 
    </LongTooBig> 
</xsl:template> 

在此測試案例的XML文檔:

<items> 
    <item> 
     <locations> 
      <location> 
       <latitude>10</latitude> 
       <longitude>10</longitude> 
      </location> 
     </locations> 
    </item> 
    <item> 
     <locations> 
      <location> 
       <latitude>-100</latitude> 
       <longitude>10</longitude> 
      </location> 
     </locations> 
    </item> 
    <item> 
     <locations> 
      <location> 
       <latitude>123</latitude> 
       <longitude>10</longitude> 
      </location> 
     </locations> 
    </item> 
    <item> 
     <locations> 
      <location> 
       <latitude>0</latitude> 
       <longitude>-200</longitude> 
      </location> 
     </locations> 
    </item> 
    <item> 
     <locations> 
      <location> 
       <latitude>0</latitude> 
       <longitude>500</longitude> 
      </location> 
     </locations> 
    </item> 
</items> 

返回如下:

<GoodItems>1</GoodItems> 
<LatTooSmall>1</LatTooSmall> 
<LatTooBig>1</LatTooBig> 
<LongTooSmall>1</LongTooSmall> 
<LongTooBig>1</LongTooBig> 

你也可以使用abs()如果你有XSLT 2,雖然Dimitre有在1.0解決方法here