[xsl]imbrication de balise

Nass2 -  
 Nass2 -
Bonjour,
j'ai un problème avec l'imbrication de balise en xsl.
je m'explique : j'ai un fichier xml comme suis :
<Worksheet>
  <Table>
   <Row>
    <Cell><Data>1</Data></Cell>
    <Cell><Data>Menu 1</Data></Cell>
   </Row>
   <Row>
    <Cell><Data>2</Data></Cell>
    <Cell><Data>Sous Menu 1.1</Data></Cell>
   </Row>
   <Row>
    <Cell><Data>2</Data></Cell>
    <Cell><Data>Sous Menu 1.2</Data></Cell>
   </Row>
   <Row>
    <Cell><Data>2</Data></Cell>
    <Cell><Data>Sous Menu 1.3</Data></Cell>
   </Row>
   <Row>
    <Cell><Data>3</Data></Cell>
    <Cell><Data>Sous Menu 1.3.1</Data></Cell>
   </Row>
  </Table>
 </Worksheet>


le but est de la formater avec un fichier xsl pour obtenir un menu
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version="1.0">
<xsl:output method="xml" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" encoding="UTF-8"/>

<xsl:template match="/Worksheet">
    <xsl:variable name="nbLigne">
        <xsl:value-of select="count(Table/Row)"/>
    </xsl:variable>
<div id="menu">
	<div id="menu-titre">
		MENU
	</div>
	<div id="menu-contenu">
	<ul>
		<xsl:for-each select="Table/Row">
			<li>
		<xsl:variable name="rang" select="Cell[position() = 1]/Data" />
		<xsl:if test="position() = 1">
			<xsl:variable name="rangprec" select="1" />
		</xsl:if>
		<xsl:if test="rang > rangprec">
			<ul>
		</xsl:if>
			<li><span>
			<xsl:value-of select="Cell[position() = 2]/Data" />
			</span>
		<xsl:if test="rang = rangprec">
			</li>
		</xsl:if>
		<xsl:if test="rang < rangprec">
				</ul></li>
		</xsl:if>
		<xsl:variable name="rangprec" select="Cell[position() = 1]/Data" />
		</xsl:for-each>
	</ul>
	</div>
</div>

</xsl:template>
</xsl:stylesheet>


le problème ce situe au niveau de l'imbrication des balises <ul> ou <li> avec les balise <xsl:if> et </xsl:if> en effet le xsl nécessite que les balises ouvertes soit fermé en l'occurrence elles le sont mais pas au sein de le même imbrication

Pour ce qui est du message d'erreur obtenu (avec le moteur xsl de php) :
Warning: DOMDocument::load() [domdocument.load]: Opening and ending tag mismatch: ul line 21 and xsl:if in file:menu.xsl, line: 22 in traitement.php on line 108


quelqu'un peut m'aider
Merci d'avance pour vos réponses

1 réponse

Nass2
 
j'ai trouver :
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version="1.0">
<xsl:output method="xml" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" encoding="UTF-8"/>

<xsl:template match="/Worksheet">
    <xsl:variable name="nbLigne">
        <xsl:value-of select="count(Table/Row)"/>
    </xsl:variable>
<div id="menu">
	<div id="menu-titre">
		MENU
	</div>
	<div id="menu-contenu">
	<ul>
		<xsl:variable name="rangprec" select="1" />
		<xsl:for-each select="Table/Row">
		<xsl:variable name="rang" select="Cell[position() = 1]/Data" />
		<xsl:variable name="pos" select="position()" />
		<xsl:value-of select="$rangprec" />><xsl:value-of select="$rang" />
		<xsl:if test="$rang > $rangprec">
			<xsl:text disable-output-escaping="yes"><ul></xsl:text>
		</xsl:if>
			<xsl:text disable-output-escaping="yes"><li></xsl:text>
			<span>
			<xsl:value-of select="Cell[position() = 2]/Data" />
			</span>
		<xsl:if test="$rang = $rangprec">
			<xsl:text disable-output-escaping="yes"></li></xsl:text>
		</xsl:if>
		<xsl:if test="$rang < $rangprec">
				<xsl:text disable-output-escaping="yes"></ul></li></xsl:text>
		</xsl:if>
		<xsl:variable name="rangprec" select="Cell[position() = 1]/Data" />
		</xsl:for-each>
	</ul>
	</div>
</div>

</xsl:template>
</xsl:stylesheet>


maintenant j'ai a faire à d'autre erreur
1