Jak mogę sprawdzić, czy wartość jest pusta lub pusta w XSL ?
Na przykład, jeśli categoryName
jest pusty? Używam przy wyborze konstruktu.
Na przykład:
<xsl:choose>
<xsl:when test="categoryName !=null">
<xsl:value-of select="categoryName " />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="other" />
</xsl:otherwise>
</xsl:choose>
xsl:when
do testów węzłów. Zastanów się<xsl:template match="Category[categoryName[not(node())]]">...
razem z<xsl:template match="Category">...
. Procesor podejmie wtedy właściwe dla Ciebie decyzje i nie musisz już zapisywać logiki biznesowej w zagnieżdżonymxsl:choose
. W wielu przypadkach użycie pasujących szablonów ułatwia pisanie arkuszy stylów.Odpowiedzi:
Edycja : Obejmuje to, moim zdaniem, najbardziej prawdopodobną interpretację „[nie] zerowy lub pusty”, jak wynika z pytania, w tym pseudokod i moje własne wczesne doświadczenia z XSLT. Tj. „Co jest równoważne z następującą Javą?”:
Aby uzyskać więcej informacji, np. Wyraźne identyfikowanie wartości null vs. pusta, zobacz odpowiedź Johnavey poniżej i / lub „skrzypce” XSLT , które dostosowałem z tej odpowiedzi, która obejmuje opcję w komentarzu Michaela Kaya, a także szóstą możliwą interpretację.
źródło
test="not(categoryName = '')"
. Podana odpowiedź zwróci false, jeśli element categoryName jest nieobecny, co w mojej interpretacji pytania sprawia, że jest to zła odpowiedź.<xsl:for-each select="root/*[matches(name(.), 'grp')]">
aby można go było używać w VS2010?Wobec braku innych informacji przyjmuję następujący kod XML:
Przykładowy przypadek użycia wyglądałby następująco:
źródło
</CategoryName>
? , testy pustych ciągów nie działają w tym przypadku</CategoryName>
ani nie ma takiej potrzeby.Z pustego elementu :
Aby sprawdzić, czy wartość określonego węzła jest pusta
To zależy od tego, co rozumiesz przez „pusty”.
not(node())
not(string(.))
not(normalize-space(.))
not(node()[not(self::comment())])
źródło
not(text())
. Alternatywą dla twojego drugiego pocisku jest równieżnot(.//text())
. Jak pokazuje twój ostatni pocisk: istnieje wiele sposobów na rozważenie „nicości”;).if ($mystring) then ... else ...
Co powiesz na?
źródło
<categoryName> <!-- some comment --> </categoryName>
a poza tym brak sensownego tekstu, to nadal oceniatrue
Pierwsze dwa dotyczą wartości pustej, a drugie dwa pustego ciągu.
źródło
xsl:apply-templates
i dopasuj szablony, aby uzyskać to, czego chcesz, o wiele łatwiej.W niektórych przypadkach możesz chcieć wiedzieć, kiedy wartość jest konkretnie pusta, co jest szczególnie konieczne, gdy używasz XML, który został zserializowany z obiektów .NET. Chociaż zaakceptowana odpowiedź działa w tym przypadku, zwraca ten sam wynik, gdy ciąg znaków jest pusty lub pusty, tj. „”, Więc nie można odróżnić.
Możesz więc po prostu przetestować atrybut.
Czasami konieczna jest znajomość dokładnego stanu i nie można po prostu sprawdzić, czy wystąpiła instancja CategoryName, ponieważ w przeciwieństwie do Javascript
Zwróci wartość true dla elementu zerowego.
źródło
Wiem, że to pytanie jest stare, ale między wszystkimi odpowiedziami brakuje mi jednego, które jest powszechnym podejściem do tego przypadku użycia w rozwoju XSLT.
Wyobrażam sobie, że brakujący kod z OP wygląda mniej więcej tak:
I że dane wejściowe wyglądają mniej więcej tak:
Tzn. Zakładam, że może być zero, pusty, pojedynczy lub wiele
categoryName
elementów. Aby poradzić sobie z tymi wszystkimi przypadkami za pomocąxsl:choose
konstruktów-style, lub innymi słowy, koniecznie szybko robi się bałagan (tym bardziej, jeśli elementy mogą znajdować się na różnych poziomach!). Typowym idiomem programistycznym w XSLT jest używanie szablonów (stąd T w XSLT), co jest programowaniem deklaratywnym, a nie koniecznym (nie mówisz procesorowi, co ma robić, po prostu mówisz, co chcesz uzyskać, jeśli spełnione są określone warunki). W tym przypadku użycia może to wyglądać mniej więcej tak:Działa to (z każdą wersją XSLT), ponieważ pierwsza powyżej ma wyższy priorytet (ma predykat). Drugi szablon dopasowania „przechodzący” łapie wszystko, co nie jest prawidłowe. Trzeci zadba następnie
categoryName
o prawidłowe wyprowadzenie wartości.Należy zauważyć, że w tym scenariuszu nie ma potrzeby, aby specifially dopasować
categories
lubcategory
, ponieważ procesor będzie automatycznie przetwarzać wszystkie dzieci, chyba że mówimy to inaczej (w tym przykładzie, drugi i trzeci szablon nie dalej przetwarzać dzieci, bo nie maxsl:apply-templates
w im).To podejście jest łatwiejsze do rozszerzenia niż podejście imperatywne, ponieważ automatycznie zajmuje się wieloma kategoriami i można je rozszerzyć o inne elementy lub wyjątki, po prostu dodając inny pasujący szablon. Programowanie bez rozgałęzień if .
Uwaga: nie ma czegoś takiego jak
null
w XML. Istnieje xsi: zero , ale jest to rzadko używane, szczególnie rzadko w nietypowych scenariuszach bez jakiegoś schematu.źródło
Jest to prawdopodobnie najprostsze wyrażenie XPath (to w zaakceptowanej odpowiedzi zapewnia test odwrotny i byłoby dłuższe, gdyby było zanegowane):
Objaśnienie :
Argument
not()
funkcji powyżej jestfalse()
dokładnie wtedy, gdy nie macategoryName
elementu podrzędnego („null”) elementu kontekstu lub (jedno takiecategoryName
dziecko ) ma wartość ciągu - pusty ciąg.W XSLT 2.0 użyj :
Oto kompletny przykład :
Po zastosowaniu tej transformacji w następującym dokumencie XML:
pożądany, poprawny wynik jest generowany :
Po zastosowaniu w tym dokumencie XML :
lub na ten temat:
lub w tej sprawie
powstaje poprawny wynik :
Podobnie użyj tej transformacji XSLT 1.0 :
Uwaga : W ogóle nie są używane warunki warunkowe. Dowiedz się więcej o znaczeniu unikania konstrukcji warunkowych w tym ładnym kursie Pluralsight:
„ Wzorce projektowania taktycznego w .NET: kontrola przepływu ”
źródło
Jeśli istnieje możliwość, że element nie istnieje w pliku XML, sprawdziłbym zarówno, czy element jest obecny, jak i długość łańcucha jest większa niż zero:
źródło
categoryName
daje ci wyrażenie XPath , gdycategoryName
w bieżącym kontekście nie ma elementów potomnych) jest zdefiniowana jako pusty ciąg, więc jest nadmiarowy -string-length(categoryName)
wynosi zero, jeśli nie ma żadnychcategoryName
elementów.Jeśli węzeł nie ma dostępnej wartości w wejściowym pliku XML, takim jak poniżej xpath,
Funkcja string () konwertuje na pustą wartość. To działa dobrze:
źródło
Coś takiego działa dla mnie:
Albo na odwrót:
Uwaga: Jeśli nie sprawdzisz wartości zerowych lub nie obsłużysz wartości zerowych, IE7 zwróci -2147483648 zamiast NaN.
źródło
Właściwie to uważam, że lepiej jest po prostu sprawdzać długość łańcucha, ponieważ wiele razy pole nie jest puste, tylko puste
źródło
Z mojego doświadczenia wynika, że najlepszym sposobem jest:
źródło
Użyj prostej categoryName / text () Taki test działa dobrze na
<categoryName/>
i również<categoryName></categoryName>
.źródło