2009-06-22 7 views
2

J'utilise des modèles XSL pour servir de modèles de pages Web pour un framework Web, la sortie finale étant XHTML 1.0 Strict; il prend l'entrée XML et sort le XHTML. Cela fonctionne parfaitement à l'exception d'un problème: la sortie de fin envoie également un noeud XML au lieu du contenu. Voici le code XML de base (manque certains éléments, mais la conception d'ensemble est le même):Débarrassez-vous du noeud racine XML dans la sortie du modèle XSL

<Page> 
    <PageScript> 
     <Script>./js/myscript.js</Script> 
    </PageScript> 
    <PageCSS> 
     <CSS>./css/mycss.css</CSS> 
    </PageCSS> 
    <PageContent>Blah blah blah</PageContent> 
</Page> 

est ici le modèle XSL

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:response="http://www.ntforl.com/" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml" 
    xmlns:lang="en"> 

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

    <xsl:template match="//PageCSS"> 
     <xsl:for-each select="CSS"> 
      <link type="text/css" rel="stylesheet"> 
       <xsl:attribute name="href"> 
        <xsl:value-of select="." /> 
       </xsl:attribute> 
      </link> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="//PageScript"> 
     <xsl:for-each select="Script"> 
      <script type="text/javascript"> 
       <xsl:attribute name="src"> 
        <xsl:value-of select="." /> 
       </xsl:attribute> 
      </script> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/" disable-output-escaping="yes"> 
     <html> 
      <head> 
       <title> 
        <xsl:value-of select="//PageTitle" /> 
       </title> 
       <meta http-equiv="content-type" content="text/html;charset=utf-8" /> 
       <link type="text/css" rel="stylesheet" href="template/style/globalStyle.css" /> 
       <link type="text/css" rel="stylesheet" href="template/style/standards.css" /> 
       <xsl:apply-templates select="//PageCSS" /> 
       <script type="text/javascript" src="template/js/some_file.js"></script> 
       <xsl:apply-templates select="//PageScript" /> 
      </head> 
      <body onload=""> 
       <div id="container"> 
        <div id="top"> 
         <div class="clear" /> 
        </div> 
        <div id="main"> 
         <div class="left" style="width: 708px; margin-top: 10px;"> 
          <h1 class="center"> 
           <xsl:value-of select="//PageTitle" /> 
          </h1> 
         </div> 
         <div class="clear" /> 
         <div id="rightPane"> 
          <div id="rightPaneContent"> 
           <xsl:apply-templates select="//PageContent" /> 
          </div> 
          <img src="template/images/mainBgBottom.png" alt="" /> 
         </div> 
        </div> 
       </div> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

Le problème réside dans le PageContent, et il se produit uniquement avec le PageContent. Lorsque la transformation est exécutée, le modèle sort

<PageContent xmlns=""> node content </PageContent> 

dans le XHTML. J'ai besoin de savoir comment m'en débarrasser afin que je puisse avoir un document XHTML 1.0 Strict valide. La chose étrange est que le nœud PageContent est le seul nœud à le faire, aucun autre nœud ne l'obtient avec le nom du nœud dans la sortie. Quelle est la raison de ce comportement?

Répondre

2

Je voudrais essayer de remplacer <xsl:apply-templates select="//PageContent" /> avec:

<xsl:apply-templates select="//PageContent/node()" /> 
3

Vous appelez apply-templates sur le nœud PageContent:

<xsl:apply-templates select="//PageContent" /> 

Le seul modèle qui correspond à c'est celui-ci, de sorte que le noeud PageContent est copié:

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

Probablement, vous devez ajouter un autre modèle qui correspond PageContent et traite seulement les nœuds enfants, sans copier PageContent lui-même:

<xsl:template match="//PageContent"> 
    <xsl:apply-templates/> 
</xsl:template> 
+0

Merci à tous, ils sont très utiles. J'ai une autre question cependant. Ceux-ci se débarrassent du problème de nœud parent, mais le premier nœud à l'intérieur du PageContent obtient un attribut 'xlmns =" ​​"', et j'étais curieux de savoir si cela pouvait être laissé de quelque façon que ce soit. Si cela vous aide, le nœud PageContent contient xhtml - c'est la partie principale de la page dans xhtml - le résultat de l'exécution du processus demandé par l'utilisateur. –

2

Comme nous l'avons souligné par @sth et @molf, vous obtenez le nœud copié par votre modèle d'identité (<xsl:template match="@*|node()">), car aucun autre modèle de votre feuille de style ne correspond aux noeuds <PageContent>.

Comme alternative aux solutions déjà présentées par les deux autres, vous pouvez changer le modèle d'identité:

<xsl:template match="@*|node()[not(self::PageContent)]"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

Lorsque <PageContent> est maintenant rencontré, le modèle d'identité ne correspond pas plus. Le modèle par défaut implicite pour les éléments seront utilisés à la place, ce qui est:

<xsl:template match="*"> 
    <xsl:apply-templates /> 
</xsl:template> 

Cela signifie que les modèles vont être appliqués aux enfants de <PageContent> automagiquement, et le nœud lui-même ne va pas être copié - juste ce que tu veux.

Questions connexes