2012-03-29 13 views
5

Czy istnieje sposób ograniczenia sekcji XSLT do pojedynczego węzła, tak aby za każdym razem nie była potrzebna cała ścieżka węzła?Ograniczanie sekcji XSLT do pojedynczego węzła

Na przykład ...

Name: <xsl:value-of select="/root/item[@attrib=1]/name"/> 
Age: <xsl:value-of select="/root/item[@attrib=1]/age"/> 

Można to zrobić za pośrednictwem dla-każdego polecenia, ale jestem skłonni uwierzyć, że te należy unikać, jeśli to w ogóle możliwe ...

<xsl:for-each select="/root/item[@attrib=1]"/> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:for-each> 

Chyba pytam, czy istnieje odpowiednik XSLT polecenia VB.NET With?

Wolałbym uniknąć xsl: template dla czytelności, ponieważ dany plik XSLT jest duży, ale z przyjemnością akceptuję, jeśli jest to jedyny sposób, aby to zrobić. A jeśli tak, to jaka jest składnia wywołania konkretnego szablonu na podstawie określonego węzła?

Aktualizacja

W nawiązaniu do odpowiedzi przez @javram, możliwe jest, aby dopasować osobne szablony na podstawie konkretnych atrybutów/węzłów.

<xsl:apply-templates select="/root/item[@attrib=1]"/> 
<xsl:apply-templates select="/root/item[@attrib=2]"/> 

<xsl:template match="/root/item[@attrib=1]"> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:template> 

<xsl:template match="/root/item[@attrib=2]"> 
    Foo: <xsl:value-of select="foo"/> 
</xsl:template> 
+0

Nie ma nic złego jako takiego z użyciem 'xsl: for-each', tak jak tu robisz. W tym przypadku działa dobrze w sposób "z" rodzaju. Ludzie radzą, aby nie używać 'xsl: for-each' do jawnego zapętlenia czegoś, gdy XSLT zapewnia lepsze sposoby na równoważenie, na przykład pozwalając szablonom zastosować i dopasować. –

+0

Downvoter ... czy mogę zapytać, dlaczego i po tak długim czasie? – freefaller

+0

Downvoter ... nie, nie sądzę ... po prostu chowaj się za anonimowość SO, zamiast być konstruktywnym. Dzięki, wielkie dzięki! – freefaller

Odpowiedz

2

Prawidłowy sposób byłoby użyć szablonu:

<xsl:apply-templates select="/root/item[@attrib=1]"/> 

. 
. 
. 

<xsl:template match="/root/item"> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:template> 
+0

Chociaż nie jest tak wizualnie miły jak blok typu "Z", myślę, że masz rację, że to jest właściwy sposób robienia tego. W następstwie pytania nie są dozwolone w komentarzach, czy byłbyś na tyle uprzejmy, aby pokazać, jak pasowałbyś do innego szablonu, gdyby @attrib został zmieniony?Zaktualizuję moje pytanie, aby odzwierciedlić tę prośbę. – freefaller

+0

Proszę zignorować kolejne pytanie, było to raczej łatwiejsze niż mi się wydawało, zaktualizowałem poprawnie moje pytanie. – freefaller

+0

Podczas aktualizacji można było również: , który zapisałby linię kodu. Ponieważ atrybut był już uwzględniony w oddzielnych kryteriach dopasowania, oba szablony nadal byłyby trafiane. – javram

2

można używać zmiennych:

<xsl:variable name="foo" select="/root/item[@attrib=1]" /> 

<xsl:value-of select="$foo/name" /> 
<xsl:value-of select="$foo/age" /> 
+0

Nie miałem pojęcia, że ​​zmienne mogą również posiadać węzły, dziękuję za to. – freefaller

0

W XSLT 2.0 Innym możliwym styl:

<xsl:value-of select='/root/item[@attrib=1]/ 
         concat("Name: ", name, " Age: ", age)'/> 
+0

Niestety, wciąż jesteśmy na 1.0, a blok na okładkach "With" jest o wiele za duży, by "concat" był przydatny. Ale doceniam wkład, dziękuję. – freefaller

0

To:

<xsl:for-each select="/root/item[@attrib=1]"/> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:for-each> 

schodzi do wszystkich węzłów (każdy pasujący węzeł, jeden po drugim).

to:

<xsl:for-each select="(/root/item[@attrib=1])[1]"/> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:for-each> 

zjazdy na pierwsze (ewentualnie tylko) Dalsze węzła i jest równoznaczne z oświadczeniem VB.NET With jak chciałeś.

Powiązane problemy