2011-12-14 17 views
9

Mam xml jak, wartości mogą byćSprawdzanie wszystkie wartości w elemencie są takie same

<n1>value1</n1> 
<n1>value1</n1> 
<n1>value2</n1> 

muszę sprawdzić, czy wszystkie te wartości są takie same i jeśli sam będę potrzebował, aby przypisać go do innego elementu. Używam XSLT v1.0.

Dzięki,

+0

Próbowałam z poprzedniego rodzeństwo, ale może go uruchomić – Arun

Odpowiedz

0

przyjąć dokument ten formularz:

<root> 
    <n1>value1</n1> 
    <n1>value1</n1> 
    <n1>value1</n1> 
</root> 

Poniższy prosty stylów określa, czy każdy n1 element ma taką samą wartość:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" omit-xml-declaration="yes"/> 
    <xsl:template match="/"> 
     <xsl:value-of select=" 
      concat('All same? ', count(/*/n1[.=/*/n1[1]])=count(/*/n1))"/> 
    </xsl:template> 
</xsl:stylesheet> 

wyjściowy:

All same? true 

Kluczem do tego arkusza jest wyrażenie:

count(/*/n1[.=/*/n1[1]])=count(/*/n1)) 

... który porównuje rachubę n1 elementów, których wartość jest równa wartości pierwszego n1 elementu do liczby wszystkich n1 elementów. Liczby te będą równe tylko wtedy, gdy każdy węzeł n1 ma tę samą wartość.

To może być trochę łatwiej odczytać wybierając najpierw wszystko n1 do zmiennej o nazwie n:

count($n[.=$n[1]])=count($n) 

Warunkowo wykonać pewne działania na podstawie wyniku jak ten:

<xsl:template match="/"> 
    <xsl:variable name="all" select="count(/*/n1[.=/*/n1[1]])=count(/*/n1)"/> 
    <xsl:if test="$all">All same</xsl:if> 
    <xsl:if test="not($all)">Not all same</xsl:if> 
</xsl:template> 
+0

Dobra odpowiedź, ale jest prostsza/krótsza :) –

12

Dobry pytanie, +1.

Wystarczy użyć:

not(/*/n1[1] != /*/n1) 

Zakładając, że wszystkie n1 elementy są wybierane w zmiennej o nazwie $v, ta może być wyrażona w zaledwie 14 znaków-długie XPath ekspresji:

not($v[1] != $v) 

Wyjaśnienie 1:

Z definicji:

/*/n1[1] != /*/n1 

true() jest dokładnie wtedy, gdy istnieje węzeł w /*/n1 którego ciąg wartość nie jest równa wartości string /*/n1[1]

Logicznym negacji tego:

not(/*/n1[1] != /*/n1) 

jest true() iff no węzeł w /*/n1 istnieje, którego stri Wartość ng nie jest równa wartości ciągu /*/n1[1] - to znaczy, jeśli wszystkie węzły w /*/n1 mają taką samą wartość żądań.

Wyjaśnienie 2:

Wynika to z bardziej ogólnej podwójnym prawa negacji:

every x has property y 

jest równoważne:

There is no x that doesn't have property y 
+1

+1 za wykorzystanie kwantyfikacji egzystencjalnej zgodnie z przeznaczeniem. –

Powiązane problemy