Question

Je veux transformer certains XML en HTML qui a le format suivant:

col1 col2 col3

Remarque: La sortie est HTML, avec des balises de fermeture en option omis. Ceci est le problème , et la raison d'être la question.

Un extrait du XSL j'utilise est:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output 
    doctype-system='http://www.w3.org/TR/html4/strict.dtd'
    doctype-public='-//W3C//DTD HTML 4.01//EN'
    indent='yes'
    method='html'
    />
   ...
   <xsl:for-each select="/">  
      <TR><TD><xsl:value-of select="col1"/><TD><xsl:value-of select="col2"/><TD><xsl:value-of select="col3"/></TR>
   </xsl:for-each>

Vous pouvez voir que les entrailles du XSL correspond à mon HTML désiré (enveloppées pour faciliter la lecture):

<TR>  <TD><xsl:value-of select="Column1"/>
      <TD><xsl:value-of select="Column2"/>
      <TD><xsl:value-of select="Column3"/> </TR>

Remarque: Ceux d'entre vous qui connaissent l'erreur que je reçois de la XSLT. Savons déjà la réponse, espérons-

Quand présenté avec mon XSL (qui, ne pas oublier, est une forme de xml), je reçois l'erreur non bien formé:

  

balise fermante 'TR' ne correspond pas à la balise de début 'TD'.

Cela est logique parfaite. En effet:

<TD><xsl:value-of select="Column3"/> </TR>

i ne fermez pas l'élément TD avant de fermer la TR. La question est donc:

Comment puis-je transformer xml en HTML, étant donné que HTML n'est pas xml?

Voir aussi


Mise à jour d'un

Il a été suggéré que l'on pourrait simplement < strong> inclure les balises de fermeture de toute façon, afin de rendre la validate XSL (montré emballé pour faciliter la lecture):

<TR>    <TD><xsl:value-of select="col1"/></TD>
        <TD><xsl:value-of select="col2"/></TD>
        <TD><xsl:value-of select="col3"/></TD>   </TR>

puis, à l'aide xsl:output method='html', le contenu HTML final serait balises </TD> par magie omis. Sauf que ce ne fonctionne pas:

<TR><TD>col1</TD><TD>col2</TD><TD>col3</TD></TR>

Mise à jour deux

Il a été suggéré que je renonce, ne prenez pas la peine de poser cette question, et il suffit d'inclure les balises de fermeture en option. C'est possible, mais ce n'est pas ma question. En outre, la " solution " ne fonctionne pas pour les éléments où la balise de fermeture est interdit , par exemple:.

<BR/>

ou

<BR></BR>

Comment puis-je inclure un élément <BR> dans ma sortie HTML, étant donné qu'il est interdit en HTML pour fermer un élément <BR>.

Était-ce utile?

La solution

Voici une façon de le faire :

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

 <xsl:template match="/*">
   &lt;TR>&lt;TD><xsl:value-of select="col1"/>&lt;TD><xsl:value-of select="col2"/>&lt;TD><xsl:value-of select="col3"/>&lt;/TR>
 </xsl:template>
</xsl:stylesheet>

Lorsque cette transformation est appliquée sur le document XML suivant :

<t>
 <col1>1</col1>
 <col2>2</col2>
 <col3>3</col3>
</t>

est produit correctement le résultat voulu:

   <TR><TD>1<TD>2<TD>3</TR>

Autres conseils

Je crois que la chose la plus simple est de simplement vous allez accepter d'avoir des balises de fermeture dans la sortie. Alors qu'ils pourraient être en option, je crois que la plupart des gens conviennent que les meilleures pratiques est de les inclure.

Y at-il une raison que vous ne voulez vraiment pas les balises de fermeture en option dans la sortie?

Re mise à jour deux

Il n'y a pas de problème avec cette mise à jour. Avec method="html" de <BR/> sera sortie comme <BR>:

XSLT (note <BR/>):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output 
doctype-system='http://www.w3.org/TR/html4/strict.dtd'
doctype-public='-//W3C//DTD HTML 4.01//EN'
indent='yes'
method='html'
/>

<xsl:template match="/">
<HTML><BODY>
    <TR>
        <xsl:apply-templates/>
    </TR>
    <BR/> <!-- HERE -->
</BODY></HTML>
</xsl:template>

<xsl:template match="item">
    <TD><xsl:value-of select="."/></TD>
</xsl:template>

</xsl:stylesheet>

Entrée:

<root>
<item>one</item>
<item>two</item>
</root>

Sortie (note <BR>):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<HTML><BODY>
<TR>
<TD>one</TD>
<TD>two</TD>
</TR>
<BR> <!-- HERE -->
</BODY></HTML>

Avez-vous essayé la sortie comme « HTML »? Les éléments qui ne doivent pas être auto-fermés en HTML ne sont pas (à savoir <BR>, <img>).

Si vous toujours ne pas comme la façon dont le moteur XSLT est sérialisation sortie HTML, alors vous peut définir votre <xsl:output method="text"> et construire le « HTML » que vous voulez:

&lt;TR>&lt;TD><xsl:value-of select="col1"/>&lt;TD><xsl:value-of select="col2"/>&lt;TD><xsl:value-of select="col3"/>&lt;/TR>

qui produit:

<TR><TD>col1<TD>col2<TD>col3</TR>  

Ian, avez-vous essayé <xsl:output method="text">?

http://www.w3schools.com/xsl/el_output.asp

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