2009-07-15 9 views

cevap

16

Aygıt XPath 2.0'ı desteklemiyor.

XPath 1.0 yüzden XPath mantığı ile biraz zor olması gerekir bu değerleri bulmak için, fantezi min() ve max() fonksiyonlara sahip ve düğümün kardeşleri değerleri karşılaştırmak değildir:

Maksimum :

/foo/bar[not(preceding-sibling::bar/@score >= @score) 
    and not(following-sibling::bar/@score > @score)]/@score 

az:

/foo/bar[not(preceding-sibling::bar/@score <= @score) 
    and not(following-sibling::bar/@score < @score)]/@score 

XSLT veya karınca s gibi XML dosyalarında bu sorguları gömme ise cripts, &gt;'a saygı göstererek < ve > kodlarını &lt; olarak kodlamayı unutmayın.

+0

güzel iş! İlk olarak en üst sıradaki çözümü denedim, ancak bu yinelenen maksima/minima'yı hariç tutmuyor. – udo

5

Bu çalışması gerekir ...

max(foo/bar/@score) 

... ve ...

min(foo/bar/@score) 

... Bu function reference göz atın.

+0

Tamam:

min(//bar[@score !='']/@score) 

!='' İşte

çalışan bir xpath/xquery edilir (bunu yapmak için daha iyi bir yol muhtemelen vardır) NaN değerlerini yetişmiş bir boş değerlere önlemekti. Bu XPath 2.0, kontrol edeceğim. – brasskazoo

+0

Evet, XPath 2.0. –

3

bu deneyin:

//foo/bar[not(preceding-sibling::bar/@score <= @score) and not(following-sibling::bar/@score <= @score)] 

Belki bu XPath 1.0 üzerinde çalışacak.

36

Burada biraz daha kısa bir çözüm var.

Maksimum:

/foo/bar/@score[not(. < ../../bar/@score)][1] 

az:

size yolunu değiştirmeye karar bile bar herhangi dizisine uygulanabilir olduğunu bu yüzden yüklemi kaydetmiştiniz
/foo/bar/@score[not(. > ../../bar/@score)][1] 

. Özniteliğin üst öğesinin ait olduğu öğe olduğunu unutmayın.

XSLT veya karınca komut gibi XML dosyalarında bu sorguları gömme, &lt;&gt; saygı olarak < ve > kodlamak Hatırlarsanız

.

+0

Serin ... ama (örneğin) skorun birden fazla maksimum değerinin olmayacağını garanti edemem. Bu, maksimum değeri içeren her öğe için bir değer listeleyecektir .. – brasskazoo

+1

Bunu düzeltmek için düzenlenmiş. –

+0

Muhtemelen 'number (.)' Işlevini kullanmak istersiniz, aksi halde özniteliklerin dize değerlerini karşılaştırır. Ben haklı mıyım – DanSkeel

4

Ben Çıkışlar, elbette çıkışına düşük değer

seçebilirsiniz ... parçacığı tökezledi ve benim için çalıştı bir cevap bulamadık, bu yüzden nerede sonunda kullanılarak sona erdi budur Düğümden @id değeri yerine en düşük değere sahip olursunuz.

<xsl:for-each select="/foo"> 
    <xsl:sort select="@score"/> 
    <xsl:if test="position()=1"> 
    <xsl:value-of select="@score"/> 
    </xsl:if> 
</xsl:for-each> 

maksimum değer için aynı:

<xsl:for-each select="/foo"> 
    <xsl:sort select="@score" order="descending"/> 
    <xsl:if test="position()=1"> 
    <xsl:value-of select="@score"/> 
    </xsl:if> 
</xsl:for-each> 
3

Bu beş yaşında olduğunu biliyoruz. Sadece kim arar ve buna rastlamak için biraz daha fazla seçenek ekliyorum.

Buna benzer bir şey benim için XSLT 2.0 çalıştı.

//bar/@score[@score=min(//*[@score !='']/number(@score))]