Domanda

Ho un foglio di stile XSLT 1.0 (2.0 non è un'opzione) che produce XHTML. A seconda di un parametro, può produrre un XHTML completo documento valido o solo uno snippet < div > ... < / div > , destinato a inclusione in una pagina Web.

Il mio problema è produrre diverse dichiarazioni XML in questi due casi. Per la pagina autonoma, ho bisogno di:

<xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
       doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

E per < div > uno:

<xsl:output omit-xml-declaration="yes"/>

Ma < xsl: output > non può essere incluso in un < xsl: if > . Può essere solo il diretto figlio di < xsl: stylesheet > .

L'unica soluzione che vedo è quella di creare un foglio di stile con la maggior parte dei modelli e poi due piccoli "involucri" con il giusto < xsl: output > e che < xsl: import > il foglio di stile principale.

Stavo cercando un'idea migliore ma a quanto pare non ce n'è. Seguendo i consigli di Andrew Hare e jelovirt, ho scritto due "driver", due semplici fogli di stile che chiamano il < xsl: output > e quindi il foglio di stile principale. Ecco uno di questi driver, quello per HTML standalone: ??

<?xml version="1.0" encoding="us-ascii"?>
<!-- This file is intended to be used as the main stylesheet, it creates a 
 standalone Web page. 
-->
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

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

  <xsl:param name="standalone" select="'true'"/>

  <xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
      doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

</xsl:stylesheet>
È stato utile?

Soluzione

Sembra che ti servano due diversi fogli di stile. Se possibile, dovresti creare due fogli di stile separati e chiamare dinamicamente quello che ti serve dal codice.

Altri suggerimenti

Un'altra opzione, che ho dovuto impiegare di recente, è:

  1. Ometti la dichiarazione XML in tutti i casi.
  2. Condizionalmente, genera la dichiarazione come testo senza caratteri di escape .

Funziona solo in XSLT 1.0 e 2.0 se stai eseguendo l'output su un file; non funzionerà se devi elaborare l'output come XML nello stesso passaggio, ad esempio quando si archivia in una variabile.

(Notare che le funzioni di estensione XSLT 2.0 potrebbero rendere possibile prendere questo output e trattarlo come XML in una volta sola, e XSLT 3.0 ha una funzione integrata per analizzare una stringa di input come XML.)

Esempio di frammento:

<!-- Omit the XML declaration as the base case:
    we can conditionally output a declaration 
    as text, but we *cannot* apply conditions on
    this `omit-xml-declaration` attribute here.  -->
<xsl:output method="xml" indent="no" 
    omit-xml-declaration="yes"
/>

<!-- Root element match: evaluate different cases, output XML declaration,
    XHTML DOCTYPE, or something else, then process the rest of the input. -->
<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="'... some condition ...'">
            <xsl:text disable-output-escaping="yes">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</xsl:text>
        </xsl:when>
        <xsl:when test="'... some other condition ...'">
            <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;</xsl:text>
        </xsl:when>
        <xsl:otherwise>
            <!-- ... some third kind of output ... -->
        </xsl:otherwise>
    </xsl:choose>
    <!-- Just process the rest -->
    <xsl:apply-templates/>
</xsl:template>


... [ other code ] ...

In XSLT il valore di ometti-xml-dichiarazione deve essere yes o no , non è possibile utilizzare lì i modelli di valori di attributo . Questo vale sia per 1.0 che per 2.0.

Gli attributi doctype possono usare gli AVT, ma il problema è che non puoi omettere l'attributo, puoi solo produrre un attributo vuoto e questo porta ad un output che ha stringhe di doctype vuote.

Siamo spiacenti, non può essere fatto con XSLT. Puoi utilizzare due fogli di stile diversi o impostare i parametri di output nel codice che chiama il processore XSLT.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top