2009-06-22 11 views
2

Ich verwende XSL-Vorlagen, um als Webseitenvorlagen für ein Webframework zu dienen, wobei die Endausgabe XHTML 1.0 Strict ist; Es nimmt XML-Eingabe und gibt das XHTML aus. Es funktioniert perfekt bis auf ein Problem - die Endausgabe gibt auch einen XML-Knoten statt nur den Inhalt aus. Hier ist die grundlegende XML (einige Elemente fehlen, aber das gesamte Design ist das gleiche):Entfernen Sie den XML-Wurzelknoten in der XSL-Vorlagenausgabe

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

Hier ist die XSL-Vorlage

<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> 

Das Problem in der Pagecontent befindet, und es geschieht nur mit der PageContent. Wenn die Transformation ausgeführt wird, gibt die Vorlage im XHTML-Code

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

aus. Ich muss wissen, wie ich es loswerden kann, damit ich ein gültiges XHTML 1.0 Strict-Dokument haben kann.

Die seltsame Sache ist, dass der PageContent-Knoten der einzige Knoten ist, um dies zu tun, kein anderer Knoten bekommt Inhalt mit dem Knotennamen in der Ausgabe verpackt. Was ist der Grund für dieses Verhalten?

Antwort

2

Ich würde versuchen, <xsl:apply-templates select="//PageContent" /> mit ersetzen:

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

Sie rufen apply-templates auf dem PageContent Knoten:

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

Die einzige Vorlage, die diese Spiele ist dies ein, so dass der PageContent Knoten wird kopiert:

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

Wahrscheinlich sollten Sie eine andere Vorlage hinzufügen, die PageContent passt und verarbeitet nur die untergeordneten Knoten, ohne PageContent zu Kopieren selbst:

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

Vielen Dank, diese sind sehr hilfreich. Ich habe noch eine andere Frage. Diese lösen das Problem mit dem Elternknoten, aber der erste Knoten innerhalb des PageContent erhält ein 'xlmns =" ​​"' - Attribut, und ich war neugierig, ob das irgendwie übrig sein könnte. Wenn dies hilft, hält der PageContent-Knoten xhtml - es ist im Grunde der Hauptteil der Seite in xhtml - das Ergebnis der Ausführung des vom Benutzer angeforderten Prozesses. –

2

Wie bereits von @sth und @molf wies darauf hin, erhalten Sie den Knoten, indem Sie Ihre Identität Vorlage kopiert (<xsl:template match="@*|node()">), weil keine andere Vorlage in Ihrem Stylesheet <PageContent> Knoten entspricht.

Als Alternative zu den Lösungen, die bereits von den beiden anderen präsentiert, könnten Sie die Identity-Vorlage ändern:

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

Wenn <PageContent> jetzt angetroffen wird, wird die Identity-Vorlage nicht mehr übereinstimmen. Die implizite Standardvorlage für Elemente werden stattdessen verwendet werden, das ist:

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

Dies bedeutet, dass Vorlagen <PageContent> ‚s Kinder automagically angewendet werden werden, und der Knoten selbst wird nicht kopiert werden - genau was du willst.

Verwandte Themen