2009-04-13 10 views
15

Próbuję wyprowadzić literalną wartość ciągu zmiennej, po ustawieniu w zależności od tego, czy węzeł istnieje, czy nie. Myślę, że logika sprawdzania warunków jest poprawna. Ale to nie jest outputing wartości ...<xsl: variable> Wydruk wartości zmiennej XSL za pomocą <xsl: value-of>

<xsl:variable name="subexists"/> 

<xsl:template match="class"> 
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> 
<xsl:choose> 
    <xsl:when test="joined-subclass"> 
     <xsl:variable name="subexists" select="'true'"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:variable name="subexists" select="'false'"/> 
    </xsl:otherwise> 
</xsl:choose> 
subexists: <xsl:value-of select="$subexists" /> 

Chcę go do wyjścia dosłowne ciąg albo "true" na "false". Ale niczego nie wyprowadza. Proszę pomóż! Dziękuję Ci!!!

Odpowiedz

17

W tym przypadku nie są wymagane żadne warunki warunkowe, aby ustawić zmienną.

To jedna wkładka wyrażenie XPath:

boolean(joined-subclass) 

jest true() tylko wtedy, gdy dziecko bieżącego węzła, nazwany joined-subclass istnieje i jest false() inaczej.

Kompletny arkusz stylów jest:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes"/> 

<xsl:template match="class"> 
    <xsl:variable name="subexists" 
     select="boolean(joined-subclass)" 
    /> 

    subexists: <xsl:text/> 
    <xsl:value-of select="$subexists" /> 
</xsl:template> 
</xsl:stylesheet> 

Należy pamiętać, że korzystanie z funkcji XPath boolean() w tym wyrażeniu jest konwersja węzła (lub jego absense) do jednego z wartości boolowskie: true() lub false().

7

Twoim głównym problemem jest myślenie, że zmienna, którą zadeklarowałeś poza szablonem, jest tą samą zmienną, która jest "ustawiona" wewnątrz instrukcji select. Nie tak działa XSLT, zmienna nie może być ponownie przypisana. Jest to coś więcej jak to, co chcesz:

<xsl:template match="class"> 
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> 
    <xsl:variable name="subexists"> 
    <xsl:choose> 
     <xsl:when test="joined-subclass">true</xsl:when> 
     <xsl:otherwise>false</xsl:otherwise> 
    </xsl:choose> 
    </xsl:variable> 
    subexists:  <xsl:value-of select="$subexists" /> 
</xsl:template> 

A jeśli potrzebujesz zmiennej mieć „globalne” zakres następnie zadeklarować ją na zewnątrz szablonu:

<xsl:variable name="subexists"> 
    <xsl:choose> 
    <xsl:when test="/path/to/node/joined-subclass">true</xsl:when> 
    <xsl:otherwise>false</xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

<xsl:template match="class"> 
    subexists:  <xsl:value-of select="$subexists" /> 
</xsl:template> 
6

w XSLT samo <xsl:variable> puszka być zadeklarowane tylko raz i może otrzymać wartość tylko na jego deklaracji. Jeżeli deklarowanych jest więcej niż jedna zmienna w tym samym czasie, są to w rzeczywistości różne zmienne i mają różny zakres.

Dlatego droga do osiągnięcia chciał ustawienie warunkowego zmiennej i produkcji jego wartość jest następująca:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes"/> 

    <xsl:template match="class"> 
    <xsl:variable name="subexists"> 
      <xsl:choose> 
       <xsl:when test="joined-subclass">true</xsl:when> 
       <xsl:otherwise>false</xsl:otherwise> 
      </xsl:choose> 
     </xsl:variable> 
     subexists: <xsl:text/>  
     <xsl:value-of select="$subexists" /> 
    </xsl:template> 
</xsl:stylesheet> 

Gdy powyższe transformacji jest stosowane na poniższym dokumencie XML:

<class> 
<joined-subclass/> 
</class> 

pożądany wynik jest produkowany:

subexists: true