DOCTYPE dinamica in trasformazione XSLT (corretto utilizzo delle istruzioni risultato-documento)

StackOverflow https://stackoverflow.com/questions/4275304

  •  28-09-2019
  •  | 
  •  

Domanda

Sto utilizzando XSLT e la necessità di generare il doctype dinamicamente nell'output trasformato, sulla base di un parametro. Ho sentito dire che questo cann't essere fatto utilizzando XSLT 1.0, ma può con la versione 2.0, utilizzando il risultato-documento tag.

Finora, dal seguire la risposta a questa domanda , ho qualcosa di simile:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="html" indent="yes"/>
    <xsl:param name="doctype.system" select="'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'" />
    <xsl:param name="doctype.public" select="'-//W3C//DTD XHTML 1.0 Strict//EN'" />
    <xsl:template match="/">
    <xsl:result-document doctype-public="{$doctype.public}" doctype-system="{$doctype.system}" method="html">
       <html>
          <head>
            <xsl:apply-templates select="report/head/node()"/>
          </head>
          <body>
             <!-- ommitted for brevity -->
          </body>
       </html>
    </xsl:result-document>
    </xsl:template>
    </xsl:stylesheet>

Il problema di cui sopra è alcun output viene generato!

Se rimuovo i tag risultati a documenti da quanto sopra, il mio trasformare viene applicata e un documento viene emesso, come previsto.

Degli indizi? Sto usando correttamente il tag risultato-documento?


Aggiorna : In risposta ad alcuni dei commenti qui è una piccola versione che funziona, e uno che non (omettendo la parametrizzazione dell'istruzione risultato-documento)

Questo funziona (senza il risultato del documento):

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" indent="yes"/> 
<xsl:template match="/">
   <html>
      <head>

      </head>
      <body>

   </body>
   </html>   
</xsl:template>
</xsl:stylesheet>

Output:

<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body></body>
</html>

Ma questo non produce alcun output:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" indent="yes"/> 
<xsl:template match="/">
<xsl:result-document doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" method="html">
   <html>
      <head>

      </head>
      <body>

   </body>
   </html>
</xsl:result-document>   
</xsl:template>
</xsl:stylesheet>
È stato utile?

Soluzione

Come anche hai scoperto, Xalan supporta solo XSLT 1.0, ma se hai cambiato a Sassone 9, si potrebbe facilmente achive ciò che si desidera.

Inoltre, invece di definire i parametri con le impostazioni DOCTYPE, si potrebbe definire un xsl:output con un nome e l'utilizzo come formato in xsl:result-document:

<xsl:output name="my-xhtml-output" method="xml" encoding="UTF-8" indent="yes"
  doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
  doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

Nel vostro xsl:result-document quindi utilizzare questo formato di output:

<xsl:result-document href="{$filename}" format="my-xhtml-output">
  ...
</xsl:result-document>

Imo, questo rende più facile da mantenere diversi formati di output se si dispone di molti di loro.

Altri suggerimenti

Come si utilizza un 1.0 motore XSLT si dovrà creare il DOCTYPE dinamico usando xsl:text:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="yes" />

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

    <xsl:template match="/">
      <xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE html PUBLIC "</xsl:text>
      <xsl:value-of select="$doctype.public" />
      <xsl:text disable-output-escaping='yes'>" "</xsl:text>
      <xsl:value-of select="$doctype.system" />
      <xsl:text disable-output-escaping='yes'>"></xsl:text>

      <!-- further processing here -->
      <html>

      </html>
    </xsl:template>
</xsl:stylesheet>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top