2010-12-17 15 views

risposta

14

Ciao a tutti, C'è un modo per importare i fogli di stile dopo aver verificato alcune condizioni?

Come, se il valore della variabile $ a = "1" , quindi importa 1.xsl oppure importa 2.xsl.

No, la direttiva <xsl:import> è compilare in tempo solo.

In XSLT 2.0 è possibile utilizzare l'attributo use-when per una compilazione condizionale limitata.

Ad esempio:

<xsl:import href="module-A.xsl" 
    use-when="system-property('xsl:vendor')='vendor-A'"/> 

Le limitazioni dell'attributo use-when sono che non v'è alcun contesto dinamico quando l'attributo viene valutata - in particolare, che significa che non ci sono variabili in ambito definiti.

Un non-XSLT soluzione è quello di cambiare dinamicamente l'attributo href della dichiarazione <xsl:import> prima della trasformazione viene richiamato:

  1. analizzare il foglio di stile XSL in un file XML

  2. Valutare la condizione che determina quale foglio di stile deve essere importato.

  3. Impostare il valore dell'attributo href della dichiarazione <xsl:import> nell'URI del foglio di stile determinato in modo dinamico per l'importazione.

  4. Invoca la trasformazione con il foglio di stile xsl in memoria appena modificato.

+1

+1 risposta utile a qualcosa a cui stavo pensando! e sono sicuro che gli altri siano curiosi ad un certo punto – Treemonkey

+1

+1 Buona risposta. Non ha senso esporre che il lavoro 'xsl: import' o' xsl: include' sia diverso dalle istruzioni di altre lingue come 'import' o' # include'. Inoltre, poiché 'xsl: import/@ href' è un URI, quella risorsa potrebbe anche essere costruita dinamicamente (con quasi le stesse restrizioni di' @ use-when') –

2

So che questo post è vecchio, ma voglio condividere la mia opinione.

Ogni display può utilizzare un modello anziché due. La visualizzazione del valore cambierà con un'applicazione VB.

breakfast_menu.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="conditionDisplay.xsl" ?> 
<data> 
    <breakfast_menu> 
     <food> 
      <name>Belgian Waffles</name> 
      <price>$5.95</price> 
      <description>Two of our famous Belgian Waffles with plenty of real maple syrup</description> 
      <calories>650</calories> 
     </food> 

     <food> 
      <name>Strawberry Belgian Waffles</name> 
      <price>$7.95</price> 
      <description>Light Belgian waffles covered with strawberries and whipped cream</description> 
      <calories>900</calories> 
     </food> 


     <food> 
      <name>Homestyle Breakfast</name> 
      <price>$6.95</price> 
      <description>Two eggs, bacon or sausage, toast, and our ever-popular hash browns</description> 
      <calories>950</calories> 
     </food> 
    </breakfast_menu> 
    <display>1</display> 
</data> 

In questo file, ho importato il mio display e con una condizione dico il modello di quello che mi serve.

conditionDisplay.xsl

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:import href="display1.xsl"/> 
    <xsl:import href="display2.xsl"/> 
    <xsl:template match="/"> 
     <xsl:variable name="display"><xsl:value-of select= "data/display"/></xsl:variable> 
     <xsl:choose> 
      <xsl:when test="$display='1'"> 
       <xsl:call-template name="display1" /> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:call-template name="display2 /> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

display1.xsl:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template name="display1"> 
     <html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
      <body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE"> 
       <xsl:for-each select="data/breakfast_menu/food"> 
        <div style="background-color:teal;color:white;padding:4px"> 
         <span style="font-weight:bold"><xsl:value-of select="name"/> - </span> 
         <xsl:value-of select="price"/> 
        </div> 
        <div style="margin-left:20px;margin-bottom:1em;font-size:10pt"> 
         <p> 
          <xsl:value-of select="description"/> 
          <span style="font-style:italic"> (<xsl:value-of select="calories"/> calories per serving)</span> 
         </p> 
        </div> 
       </xsl:for-each> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

display2.xsl:

<?xml version="1.0" encoding="UTF-8"?>futur 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template name="display2"> 
     <html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
      <body style="font-family:Arial;font-size:12pt;background-color:#222222"> 
       <xsl:for-each select="data/breakfast_menu/food"> 
        <div style="background-color:teal;color:white;padding:4px"> 
         <span style="font-weight:bold"><xsl:value-of select="name"/> - </span> 
         <xsl:value-of select="price"/> 
        </div> 
        <div style="margin-left:20px;margin-bottom:1em;font-size:10pt"> 
         <p> 
          <xsl:value-of select="description"/> 
          <span style="font-style:italic"> (<xsl:value-of select="calories"/> calories per serving)</span> 
         </p> 
        </div> 
       </xsl:for-each> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

io sinceramente scuso per il mio terribile inglese. Sarà migliore per il prossimo post e spero che aiuterà qualcuno come penso che non sia la soluzione migliore.

+0

Ho fatto qualcosa di simile con le modalità. Buona prima risposta +1 Benvenuto in StackOverflow! –

Problemi correlati