Question

Je l'ai vu cette ressource texte du lien mais j'ai encore des difficultés pour générer un document XHTML valide en utilisant MSXML analyseur.

J'ai en entrée le document suivant:

    <?xml version="1.0" encoding="UTF-8" ?> 
- <html xml:lang="it" xmlns="http://www.w3.org/1999/xhtml">
- <head xmlns="">
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
   <title>Bla bla bla</title> 
  <link rel="stylesheet" type="text/css" media="screen" href="css/bla.css" /> 
  </head>
- <body xmlns="" style="background-color:#DFDFDF;left-margin:0;margin-top:0">
    ....
    </body>
  </html>

où les méchants xmlns = "" sont produits parce que je l'ai inséré l'instruction:

parserInstance.documentElement.setAttribute "xmlns", "http://www.w3.org/1999/xhtml"

lors de la création du document d'entrée avant la transformation.

Le XSLT importe la transformation que j'utilise pour attraper les éléments HTML

<xsl:stylesheet 
    version="1.0" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    exclude-result-prefixes="xhtml xsl"
>
<xsl:import href="_lib.xsl"/>
<xsl:import href="_standard.xsl"/>

et dans _standard.xsl J'ai le code qui font la transformation rerlevant:

<xsl:template match="html">
<xsl:copy>
    <xsl:copy-of select="@*" />
    <xsl:apply-templates select="head" />       
    <xsl:apply-templates select="body" />       
</xsl:copy>

Cependant, je n'ai pas les xmlns requis dans la balise html:

<html xml:lang="it">

et j'ai encore les xmlns désagréables intersparsed dans le code html:

<h1 xmlns="http://www.w3.org/1999/xhtml">BLA BLA</h1>

Si je reçois mal?

S'il vous plaît, REMARQUE: je dois utiliser un modèle de traction pour la transformation, je ne peux pas utiliser une transformation d'identité

Était-ce utile?

La solution

Avec le modèle DOM (MSXML utilise) l'espace de noms d'un élément ou d'un nœud attribut est déterminé lorsqu'il est créé, vous ne pouvez pas le changer par la suite et les tentatives comme la vôtre pour changer les espaces de noms en définissant un attribut avec le nom « xmlns » do ne pas modifier l'espace de noms de nœuds.

Il semble donc que si vous avez un document d'entrée avec des éléments dans aucun espace de noms et que vous voulez utiliser XSLT pour la transformer en un avec des éléments dans l'espace de noms XHTML. Dans ce cas, vous ne pouvez pas utiliser xsl: copier comme cette façon, vous obtenez des éléments de résultat dans aucun espace de noms. Au lieu de cela, vous devez par exemple.

<xsl:template match="html">
  <html xmlns="http://www.w3.org/1999/xhtml">
    ...
  </html>
</xsl:template>

ou bien sûr que vous voulez que l'espace de noms pour tous les éléments de résultat que vous pourriez mettre xmlns = « http://www.w3.org/1999/xhtml » sur le xsl: stylesheet du module ou stylesheet stylesheet (s) que vous souhaitez créer des éléments XHTML.

Autres conseils

Si vous mettez xmlns = « http://www.w3.org/1999/xhtml » sur l'élément « html » il applique à cet élément et tous ses (non qualifiés) les éléments descendants. L'élément « corps » est un modèle complètement différent de sorte que vous devez soit mettre trop ou, comme cela a déjà suggéré une déclaration d'espace de noms sur l'élément de corps, il vous suffit de mettre xmlns = "http://www.w3.org/1999/xhtml "sur tous xsl:. éléments de feuille de style de vos modules de feuille de style qui sont censés créer des éléments de XHTML

Et pas non plus que faire ou crée une copie du nœud d'entrée. Comme vos éléments d'entrée sont en aucun espace de noms si vous copiez un d'entre eux la copie dans le résultat sera également dans aucun espace de noms alors que vous voulez que les éléments de résultat à l'espace de noms XHTML. Ainsi faire xsl: copy ou xsl:. Copie de ne fonctionnera pas pour ce que vous voulez, au lieu vous devez exécuter vos éléments grâce à un modèle qui change l'espace de noms par exemple

<xsl:template match=*">
  <xsl:element name="{local-name()}" namespace="http://www.w3.org/1999/xhtml">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

@ Martin: Je suis l'affichage des échantillons. Désolé d'avoir été générique dans mon commentaire.

Document d'entrée (minimum)

    <?xml version="1.0" encoding="UTF-8"?>
<html xml:lang="it">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Page title</title>
<link rel="stylesheet" type="text/css" media="screen" href="css/stile.css"/>
</head>
<body>
<div id="errorPanel" class="errorPanel"/>
<navigation>

<panel name="navbar">
<link>
<url>resource1.htm</url>
<label>resource1</label>
</link>
</panel>

<panel name="special">
<link>
<url>resource2.htm</url>
<label>resource2</label>
</link>
</panel>
</navigation>

<content/>

<script type="text/javascript" src="lib/jquery.js"/>
<script type="text/javascript" src="backend.js"/>

</body>
</html>

Alors le principal contenu juste pour XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.w3.org/1999/xhtml" 
    exclude-result-prefixes="xsl"
>
<xsl:import href="_lib.xsl"/>
<xsl:import href="_standard.xsl"/>
<xsl:output 
    method="xml" 
    omit-xml-declaration="no" 
    encoding="UTF-8" 
    doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
/>

<xsl:template match="content">
            <h1>CONTENT</h1>
            <p>
                Bla bla bla
            </p>    
</xsl:template>
</xsl:stylesheet>

Alors _standard.xsl. Remarque, l'instruction:

<xsl:template match="html">

est utilisé temporairement, le xsl-copie a été utilisé comme dans le premier extrait de code affiché

    <xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
>

<xsl:template match="html">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <xsl:copy-of select="@*" />
        <xsl:apply-templates select="head" />       
        <xsl:apply-templates select="body" />       
    </html>
</xsl:template> 

<xsl:template match="head">
        <xsl:copy-of select="." />
</xsl:template> 

<xsl:template match="body">
    <body>
    <table id='toppanel'>
        <tr>
            <td>Bla bla bla</td>
            <td>Bla bla bla</td>
            <td>Bla bla bla</td>
        </tr>
    </table>

    <table>
    <tr>
        <xsl:apply-templates select="navigation/panel[@name='navbar']" mode="td"/>
    </tr>
    </table>

    <table>
    <tr>
        <td>
                <p>Area</p>
                <xsl:apply-templates select="navigation/panel[@name='special']" />
        </td>

        <td>
            <xsl:apply-templates select="content" />
        </td>

    </tr>
    </table>
    </body>
</xsl:template> 

</xsl:stylesheet>

J'ai trouvé dans le balisage de sortie comme ceci:

<body xmlns="">

L'espoir est clair.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top