2009-10-12 11 views
1

je le code XML suivant:XSLT - comment analyser XML avec des éléments récursifs pour Eclipse toc.xml?

<HTML> 
    <HEAD> 
    <META name="GENERATOR" content="Microsoft HTML Help Workshop 4.1" /> 
    <!-- Sitemap 1.0 --> 
    </HEAD> 
    <BODY> 
    <OBJECT type="text/site properties"> 
     <param name="FrameName" value="contents" /> 
    </OBJECT> 
    <UL> 
     <LI> 
     <OBJECT type="text/sitemap"> 
      <param name="Name" value="Title1" /> 
      <param name="Local" value="Ref1" /> 
     </OBJECT> 
     <UL> 
      <LI> 
      <OBJECT type="text/sitemap"> 
       <param name="Name" value="Title 2" /> 
       <param name="Local" value="Ref2" /> 
      </OBJECT> 
      <UL> 
       <LI> 
       <OBJECT type="text/sitemap"> 
        <param name="Name" value="Title3" /> 
        <param name="Local" value="Ref3" /> 
       </OBJECT> 
       </LI> 
       <LI> 
       <OBJECT type="text/sitemap"> 
        <param name="Name" value="Title4" /> 
        <param name="Local" value="Ref4" /> 
       </OBJECT> 
       </LI> 
      </UL> 
      </LI> 
      <LI> 
      <OBJECT type="text/sitemap"> 
       <param name="Name" value="Title5" /> 
       <param name="Local" value="Ref5" /> 
      </OBJECT> 
      </LI> 
     </UL> 
     </LI> 
     <LI> 
     <OBJECT type="text/sitemap"> 
      <param name="Name" value="Title6" /> 
      <param name="Local" value="Ref6" /> 
     </OBJECT> 
     </LI> 
    </UL> 
    </BODY> 
</HTML> 

je dois transformer un "Eclipse Help" format de fichier toc.xml, comme ceci:

<toc label="Sample Table of Contents"> 
    <topic label="Title1" href="Ref1"> 
    <topic label="Title2" href="Ref2"> 
     <topic label="Title3" href="Ref3"/> 
     <topic label="Title4" href="Ref4"/> 
     </topic> 
     <topic label="Title5" href="Ref5"> 
    </topic> 
    </topic> 
    <topic label="Title6" href="Ref6"/> 
</toc> 

J'ai essayé de créer la XSLT suivante, qui didn 't de travail:

<?xml version="1.0" encoding="utf-8"?> 
<?altova_samplexml D:\Documents and Settings\oshecht\Desktop\XSL\Copy of toc.xml?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="/"> 
    <toc> 
     <xsl:apply-templates select="//LI" /> 
    </toc> 
    </xsl:template> 

    <xsl:template match="//LI"> 
    <topic> 
     <xsl:apply-templates select="OBJECT/param" mode="val" /> 
     <xsl:apply-templates select="OBJECT/param" mode="ref" /> 
     <xsl:apply-templates select="/UL/LI" /> 
     <!--xsl:apply-templates select="//UL//LI" mode="subelement" /--> 
    </topic> 
    </xsl:template> 

    <xsl:template match="OBJECT/param" mode="val"> 
    <xsl:if test="@name = 'Name'"> 
     <xsl:attribute name="label"> 
     <xsl:value-of select="@value" /> 
     </xsl:attribute> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="OBJECT/param" mode="ref"> 
    <xsl:if test="@name = 'Local'"> 
     <xsl:attribute name="href"> 
     <xsl:value-of select="@value" /> 
     </xsl:attribute> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

Pouvez-vous s'il vous plaît aviser?

Merci :)

Répondre

3

Je pense que ce qui suit fait ce que vous voulez:

<xsl:template match="BODY"> 
    <toc label="Sample Table of Contents"> 
     <xsl:apply-templates select="UL/LI/OBJECT"/> 
    </toc> 
</xsl:template> 

<xsl:template match="OBJECT"> 
    <topic label="{param[@name='Name']/@value}" href="{param[@name='Local']/@value}"> 
    <xsl:apply-templates select="following-sibling::UL/LI/OBJECT"/> 
    </topic> 
</xsl:template> 
+0

Salut Salut Salut :) Merci cela fonctionne. Avez-vous une recommandation concernant les bons sites pour apprendre XSLT? – orly

+0

une dernière question concernant le xml: si la @ valeur contient une chaîne comme: "aaaa # bbb" et je veux seulement la partie "aaaa"? – orly

+0

'substring-before (@value, '#')' – Tomalak

1

Votre principal problème est cette ligne:

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

Cela produit une liste de tous les éléments <LI> l'entrée, et crée ainsi une liste de sortie plate. Vous pouvez utiliser le haut-récursion et « se déplacent avec le flux », comme ceci:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="BODY"> 
    <toc> 
     <xsl:apply-templates select="OBJECT" /> 
     <xsl:apply-templates select="UL" /> 
    </toc> 
    </xsl:template> 

    <xsl:template match="UL"> 
    <xsl:apply-templates select="LI" /> 
    </xsl:template> 

    <xsl:template match="LI"> 
    <topic> 
     <xsl:apply-templates select="OBJECT" /> 
     <xsl:apply-templates select="UL" /> 
    </topic> 
    </xsl:template> 

    <xsl:template match="OBJECT"> 
    <xsl:apply-templates select="param" /> 
    </xsl:template> 

    <xsl:template match="OBJECT/param"> 
    <xsl:variable name="attrName"> 
     <xsl:choose> 
     <xsl:when test="@name = 'FrameName'">label</xsl:when> 
     <xsl:when test="@name = 'Name'">label</xsl:when> 
     <xsl:when test="@name = 'Local'">href</xsl:when> 
     </xsl:choose> 
    </xsl:variable> 
    <xsl:if test="$attrName != ''"> 
     <xsl:attribute name="{$attrName}"> 
     <xsl:value-of select="@value" /> 
     </xsl:attribute> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

La sortie produite est:

<?xml version="1.0" encoding="utf-8"?> 
<toc label="contents"> 
    <topic label="Title1" href="Ref1"> 
    <topic label="Title 2" href="Ref2"> 
     <topic label="Title3" href="Ref3"></topic> 
     <topic label="Title4" href="Ref4"></topic> 
    </topic> 
    <topic label="Title5" href="Ref5"></topic> 
    </topic> 
    <topic label="Title6" href="Ref6"></topic> 
</toc> 

Notez que j'ai remplacé vos modèles « mode » cinque un <xsl:choose> . Le reste est assez évident, je pense.

Questions connexes