2009-07-13 12 views
7

Mam sytuację, w której parametr nie zostanie ustawiony, ale moje próby przechwytywania & obsługują sytację, nie działają.XSLT: Przetestuj parametr, aby dowiedzieć się, czy został ustawiony

Używam następujący:

<xsl:template match="xs:complexType"> 
    <xsl:param name="prefix" /> 

    <xsl:variable name="prefix-no-core"> 
    <xsl:choose> 
     <!-- if no value, default to 'AcRec' --> 
     <xsl:when test="not($prefix)"> 
     <xsl:value-of select="'AcRec'" /> 
     </xsl:when> 
     <!-- if 'core', leave as empty string --> 
     <xsl:when test="$prefix = 'core'"> 
     </xsl:when> 
     <!-- if 'AcRec', set the value --> 
     <xsl:when test="$prefix = 'AcRec'"> 
     <xsl:value-of select="$prefix" /> 
     </xsl:when>    
    </xsl:choose> 
    </xsl:variable> 

    <xs:complexType name="{concat($prefix-no-core, @name)}"> 
    ... 
</xsl:template> 

Ja również próbował $ prefix = '' w pierwszym badaniu - ani pracy. ale jeśli użyję:

<xsl:value-of select="not($prefix)" /> 

... wartość zostanie wydrukowana jako prawdziwa. Ale używając tego w moim xsl: choose nie generuje żadnego wyjścia.

Odpowiedz

0

sugestii zgłaszanych do tej pory, jedynym rozwiązaniem, które działało było zawsze ustawić wartość parametru gdy jest to wezwanie do szablonu. Na przykład, wcześniej miałem:

<xsl:apply-templates select="//xs:complexType[@name='AddressType']" /> 

To musiały być zmienione na:

<xsl:apply-templates select="//xs:complexType[@name='AddressType']"> 
    <xsl:with-param name="prefix" select="'AcRec'" /> 
</xsl:apply-templates> 

Naprawdę chciałbym wiedzieć, dlaczego nie ($ param) i $ param = '' nie robić pracuję w teście WHEN, ale mogę uzyskać wartość nie ($ param) w instrukcji xsl: value-of.

1

Uwaga: zastąpiona stara odpowiedź, sprawdź historię, jeśli chcesz.

Poniższy wejściowe:

<test xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="something"/> 
    <xs:complexType name="somethingElse"/> 
</test> 

Fed z następującym XSLT:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> 
    <xsl:template match="/"> 
     <xsl:for-each select="node()"> 
      <xsl:apply-templates/> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="xs:complexType"> 
     <xsl:param name="prefix" /> 
     <xsl:variable name="prefix-no-core"> 
      <xsl:choose> 
       <xsl:when test="not($prefix)">AcRec</xsl:when> 
       <xsl:when test="$prefix = 'core'"/> 
       <xsl:when test="$prefix = 'AcRec'">AcRec</xsl:when>      
      </xsl:choose> 
     </xsl:variable> 

     <xs:complexType name="{concat($prefix-no-core, @name)}"/> 
    </xsl:template> 
</xsl:transform> 

daje następujący wynik:

<xs:complexType name="AcRecsomething" xmlns:xs="http://www.w3.org/2001/XMLSchema"/> 
<xs:complexType name="AcRecsomethingElse" xmlns:xs="http://www.w3.org/2001/XMLSchema"/> 

Nie jestem pewien, co bardziej jesteś szukam ...

+0

Potrzebuję obsługiwać inne prefiksy. –

+0

Próbowałem - xsl: w przeciwnym razie daje mi fałszywe alarmy, stosując prefiks do tych, których nie powinien. –

+0

Kiedy nie chcesz stosować prefiksu? Ponownie, podaj nam kompletny przypadek użycia. Jeśli prefiks = rdzeń, nie chcesz mieć prefiksu. Jeśli prefiks nie jest ustawiony, chcesz AcDec jako przedrostek. Co to jest w drugim przypadku? Czy chcesz użyć podanego przedrostka, czy też chcesz ręcznie dodać literę do każdego "dozwolonego" prefiksu. Jeśli tak, to co się dzieje, że wywołujący udostępnia prefiks, którego nie rozpoznajesz? –

1

To hack, ale odniosłem sukces, najpierw zawijając parametr funkcją normalize-space() przed testowaniem pustego parametru.

<xsl:value-of select="not(normalize-space($prefix))" /> 
+0

Próbowałem tego jako klauzuli when - obsługiwał fałszywych alarmów. –

8

Można podać wartość domyślną dla parametru, w ten sposób, gdy nie zostanie ona przekazana, można to sprawdzić.

Chociaż w twoim przykładzie wygląda na to, że posiadanie wartości domyślnej znacznie uprościłoby wszystko.

<xsl:template match="xs:complexType"> 
    <xsl:param name="prefix" select="'default-value'" /> <!-- SET default --> 

    <xsl:variable name="prefix-no-core"> 
    <xsl:choose> 
     <!-- if no value, default to 'AcRec' --> 
     <xsl:when test="$prefix = 'default-value'"> 
     <xsl:value-of select="'AcRec'" /> 
     </xsl:when> 
     <!-- if 'core', leave as empty string --> 
     <xsl:when test="$prefix = 'core'"> 
     </xsl:when> 
     <!-- if 'AcRec', set the value --> 
     <xsl:when test="$prefix = 'AcRec'"> 
     <xsl:value-of select="$prefix" /> 
     </xsl:when>      
    </xsl:choose> 
    </xsl:variable> 

    <xs:complexType name="{concat($prefix-no-core, @name)}"> 
    ... 
</xsl:template> 

połączeń tak, a wartość będzie 'domyślną wartość':

<xsl:apply-templates select="//xs:complexType[@name='AddressType']" /> 

połączenia w ten sposób, a wartość będzie 'przekazywana wartość':

<xsl:apply-templates select="//xs:complexType[@name='AddressType']"> 
    <xsl:with-param name="prefix" value="'passed-value'"/> 
</xsl:apply-templates> 

EDYCJA: Dla kompletności uproszczona forma oryginalnego przykładu to:

<xsl:template match="xs:complexType"> 
    <xsl:param name="prefix" select="'AcRec'"/> 

    <xsl:variable name="prefix-no-core"> 
    <xsl:choose> 
     <!-- if 'core', leave as empty string --> 
     <xsl:when test="$prefix = 'core'"> 
     </xsl:when> 
     <!-- defaults to 'AcRec' --> 
     <xsl:otherwise> 
     <xsl:value-of select="$prefix" /> 
     </xsl:otherwise>      
    </xsl:choose> 
    </xsl:variable> 

    <xs:complexType name="{concat($prefix-no-core, @name)}"> 
    ... 
</xsl:template> 
+0

Jeśli potrzebujesz wartości domyślnej parametru, który nie pochodzi z żadnego elementu XML (tj. Zakodowanej wartości literalnej), użyj " wartość literalna tutaj' –

Powiązane problemy