2010-05-21 6 views
1

Je suis assez nouveau à xslt (2.0) et j'ai quelques problèmes avec un problème délicat. Essentiellement, j'ai un mal formaté fichier html comme ci-dessous:Tricky problème avec l'utilisation de xslt avec html mal formé

<html> 
    <body> 

    <p> text 1 </p> 
    <div> <p> text 2</p> </div> 
    <p> Here is a list 
     <ul> 
      <ol> 
       <li> ListItem1 </li> 
      <li> ListItem1 </li> 
     </ol> 
     <dl> 
      <li> dl item </li> 
      <li> dl item2 </li> 
     </dl> 
    </ul> 
    <div> 
    <p> I was here</p> 
    </div> 
    </p> 
</body> 
</html> 

Et je suis en train de le mettre dans un fichier XML bien formaté. Dans mon fichier xslt, je vérifie de manière récursive si tous les enfants d'un p ou d'un div sont d'autres p ou div et les promouvons simplement, sinon je les utilise comme des paragraphes autonomes. J'ai étendu cette idée de sorte que si un p ou div avec une liste d'enfants se présentent correctement, mais ne favorisent pas la liste des enfants.

Un problème que j'ai est que le fichier XML de sortie que je reçois est le suivant

<?xml version="1.0" encoding="utf-8"?><html> 
    <body> 

    <p> text 1 </p> 
    <p> text 2</p> 
    Here is a list 
    <ul> 
     <ol> 
      <li> ListItem1 </li> 
      <li> ListItem1 </li> 
     </ol> 
     <dl> 
      <li> dl item </li> 
      <li> dl item2 </li> 
     </dl> 
    </ul> 

    <p> I was here</p> 



</body> 
</html> 

« Voici une liste » doit être dans les balises de paragraphe trop! Je deviens fou en essayant de résoudre ceci ... Toute contribution/liens serait grandement appréciée.

+0

Ce n'est pas une réponse à votre question, mais HTML Tidy fait un excellent travail de gestion de ce genre de problème sans vous obliger à faire des conjectures. Si vous voulez des conseils XSLT, vous devez probablement poster les parties pertinentes de votre code. –

+0

Bonne question (+1). Voir ma réponse pour une solution courte mais complète. :) –

Répondre

1

Cette transformation:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

<xsl:template match= 
    "div[descendant::div or descendant::p] 
    | 
    p[descendant::div or descendant::p] 
    "> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match= 
    "div[descendant::div or descendant::p]/text() 
    | 
    p[descendant::div or descendant::p]/text() 
    "> 
    <xsl:element name="{name(..)}" 
     namespace="{namespace-uri(..)}"> 
    <xsl:copy-of select="."/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur le document XML fourni, produit le voulait, une sortie correcte:

<html> 
    <body> 
     <p> text 1 </p> 
     <p> text 2</p> 
     <p> Here is a list 

     </p> 
     <ul> 
     <ol> 
      <li> ListItem1 </li> 
      <li> ListItem1 </li> 
     </ol> 
     <dl> 
      <li> dl item </li> 
      <li> dl item2 </li> 
     </dl> 
     </ul> 
     <p> I was here</p> 
    </body> 
</html> 
+0

Merci beaucoup pour votre aide! Il est extrêmement difficile de trouver des gens qui connaissent xslt. À votre santé – Pharaon