3

我有以下 XML:

<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])

有谁知道这是否可能?如果不是,谁能想到一个巧妙的解决方法?

谢谢大家。

4

1 回答 1

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>

如果你有 xslt 2,你也可以使用abs(),尽管 Dimitre 在 1.0这里有一个解决方法

于 2012-11-02T12:52:31.690 回答