Condividi tramite


Esempio 1 di <xsl:apply-imports>

L'esempio seguente mostra come usare <xsl:apply-imports> per riutilizzare il codice in modo più efficace. Nell'esempio vengono utilizzati quattro file principali.

  • Il file di origine XML, ops.xml. Questo file di dati definisce tre operazioni: add (+), sub (-) e mul (*).

  • Il foglio di stile XSLT principale, ops.xsl. Questo file contiene le regole di modello delle operazioni, inclusi due elementi <xsl:import>. I fogli di stile importati eseguono operazioni aritmetiche e operazioni sulle stringhe in una determinata origine dati.

  • Un foglio di stile importato, arith.xsl. Il file XSLT esegue operazioni aritmetiche su ogni elemento <op>.

  • Un altro foglio di stile importato, str.xsl. Questo file XSLT esegue operazioni personalizzate sulle stringhe. In questo caso add (+) viene considerato una concatenazione di stringhe. Ad esempio 1+2 diventa 12. Analogamente, mul (*) viene considerato una concatenazione inversa. 1*2 diventa 21. Si noti che sub (-) è un'operazione sulle stringhe non definita.

File XML (ops.xml)

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="ops.xsl"?>
<ops>
  <desc>Some binary operations</desc>
  <op name="add" symbol="+">
    <operand>1</operand>
    <operand>2</operand>
  </op>
  <op name="sub" symbol="-">
    <operand>1</operand>
    <operand>2</operand>
  </op>
  <op name="mul" symbol="*">
    <operand>1</operand>
    <operand>2</operand>
  </op>
</ops>

File XSLT principale (ops.xsl)

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                version="1.0">
  <xsl:import href="arith.xsl"/>
  <xsl:import href="str.xsl"/>
  <xsl:template match="op">
    <xsl:value-of select="operand[1]"/>
    <xsl:value-of select="@symbol"/>
    <xsl:value-of select="operand[2]"/>
    = <xsl:apply-imports/>
    <br/>
  </xsl:template>
</xsl:stylesheet>

File XSLT importato (arith.xsl)

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                version="1.0">
  <xsl:template match="op[@symbol='+']">
    <xsl:value-of select="sum(operand)"/> (from arith.xsl)
  </xsl:template>
  <xsl:template match="op[@symbol='-']">
    <xsl:value-of select="number(operand[1])-number(operand[2])"/> 
   (from arith.xsl)
  </xsl:template>
  <xsl:template match="op[@symbol='*']">
    <xsl:value-of select="number(operand[1])*number(operand[2])"/> 
    (from arith.xsl)
  </xsl:template>
</xsl:stylesheet>

File XSLT importato (str.xsl)

<?xml version="1.0"?>
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                  version="1.0">
  <xsl:template match="desc">
    <DIV><xsl:value-of select="."/></DIV>
  </xsl:template>
  <xsl:template match="op[@name='add']">
    <xsl:value-of select="operand[1]"/>
    <xsl:value-of select="operand[2]"/> (from str.xsl)
  </xsl:template>
  <xsl:template match="op[@name='mul']">
    <xsl:value-of select="operand[2]"/>
    <xsl:value-of select="operand[1]"/> (from str.xsl)
  </xsl:template>
</xsl:stylesheet>

Output

È necessario ottenere il seguente output:

Some binary operations

1+2 = 12 (from str.xsl)

1-2 = -1 (from arith.xsl)

1*2 = 21 (from str.xsl)

Note

L'ultimo foglio di stile importato ha la priorità di importazione maggiore. Nell'esempio seguente str.xsl è stato importato per ultimo, quindi ha una priorità di importazione maggiore rispetto a arith.xsl. Entrambi i fogli di stile importati dispongono di modelli per le operazioni add e mul. Vengono chiamati solo quelli del file str.xsl. Viene utilizzata anche l'operazione sub definita in arith.xsl, in quanto nel file str.xsl non è definita alcuna operazione sub. Si supponga di invertire l'ordine degli elementi <xsl:import> nel file XSLT principale nel modo seguente:

<xsl:import href="str.xsl"/>

<xsl:import href="arith.xsl"/>

In questo caso l'output sarà il seguente:

Some binary operations

1+2 = 3 (from arith.xsl)

1-2 = -1 (from arith.xsl)

1*2 = 2 (from arith.xsl)

Inoltre, se l'istruzione <xsl:apply-imports/> è assente dalla regola di modello che esegue l'override di <op> nel file XSLT principale ops.xsl), l'output sarà il seguente:

Some binary operations

1+2 =

1-2 =

1*2 =

Ovvero la regola di modello nel foglio di stile di importazione esegue l'override delle relative regole di modello dei fogli di stile importati. L'istruzione <xsl:apply-imports/> consente di riattivare in maniera diversa queste regole di modello sottoposte a override.