Numéro d'article: 324033 - Dernière mise à jour: vendredi 16 juillet 2004 - Version: 3.3

BOGUE : Position() et fonctions XPath Last() sont ignorées lorsque vous les utilisez comme arguments de la fonction XSLT

Sommaire

Agrandir tout | Réduire tout

Symptômes

Les fonctions XPath position() et last() sont ignorées si vous utilisez les directement comme arguments de fonction (fonction standard, de script et d'extension) XSLT dans les expressions de requête de XPath sont utilisées dans les feuilles de style XSLT.

Cause

Le processeur XPath exécute les fonctions XSLT avant de définir le contexte de la position() et last() fonctions XPath.

Résolution

Utiliser des variables XSLT pour stocker les valeurs ces fonctions renvoient. Vous pouvez ensuite utiliser les variables XSLT comme les arguments de fonction XSLT dans les expressions XPath requête qui sont utilisées dans la feuille de style.

Statut

Microsoft a confirmé que c'est un problème dans les produits Microsoft répertoriés au début de cet article.

Plus d'informations

Notez que ce problème ne pas se produire lorsque les fonctions position() et last() sont utilisées dans un prédicat dans une expression qui est fourni comme un argument de fonction XSLT.

Procédure pour reproduire le comportement

  1. Dans Microsoft Visual Studio .NET, créez un nouveau projet d'application console Visual Basic .NET.
  2. Le code suivant permet de créer et ajouter un document XML nommé Repro.xml au projet :
    <Data>
    	<value>1</value>
    	<value>2</value>
    	<value>3</value>
    	<value>78</value>
    	<value>5</value>
    	<value>88</value>
    	<value>7</value>
    </Data>
    					
  3. Le code suivant permet de créer et ajouter une feuille de style XSLT nommée Repro.xsl au projet. Étudier les commentaires en ligne à comprendre la fonctionnalité du code dans la feuille de style :
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
        <xsl:key name="Values" match="value" use="."/>
    
        <xsl:template match="Data">
    	<Data>
    	        
    	<!-- 
    
    	Use the XSLT key() function to identify and output 
    	value elements whose value matches their position in the source XML. 
    
    	The following will not work because the position() function is supplied 
    	directly as an argument of the key() function. 
    
    	--> 
    	<ValuesThatMatchPosition>        
    		<xsl:for-each select="value">
           		    <xsl:if test="key('Values',position())">
    		            <value><xsl:value-of select="."/></value>   		    
    		   </xsl:if>	   
    		</xsl:for-each>	
        	</ValuesThatMatchPosition>
    
    	<!-- 
    
    	The position() function works correctly when used in a predicate in an expression supplied
    	as an XSLT function (the format-number function is used in this sample) argument. 
    
    	The select expression in the following line will retrieve the value of the 3rd value element 
    	in the source XML.
    
    	--> 
    	
    	<Position3Value><xsl:value-of select="format-number(value[position()=3],'0')"/></Position3Value>	
            
    	</Data>
        </xsl:template>       
    
    </xsl:stylesheet> 
    					
  4. Collez le code suivant dans la procédure Sub Main() dans Module1.vb pour exécuter la transformation XSLT en appliquant Repro.xsl à Repro.xml :
     Dim transform As New System.Xml.Xsl.XslTransform()
     transform.Load("..\Repro.xsl")
     transform.Transform("..\Repro.xml", "..\output.xml")
     Console.WriteLine("Done")
     Dim response As String = Console.ReadLine
    					
  5. Enregistrez et exécutez le projet. Le code de la procédure Sub Main() exécute la transformation XSLT et écrit le résultat de transformation dans un fichier nommé Output.xml dans le dossier du projet. Le message "terminé" s'affiche dans la fenêtre de console lorsque la transformation se termine. Appuyez sur une touche pour fermer la fenêtre de console et revenir à l'environnement de développement.
  6. Dans l'Explorateur de solutions, cliquez sur Actualiser le bouton pour afficher le fichier Output.xml dans le dossier du projet. Lorsque vous ouvrez le fichier Output.xml, vous verrez qu'il contient le code XML suivant :
    <?xml version="1.0" encoding="utf-8"?>
    <Data>
    	<ValuesThatMatchPosition></ValuesThatMatchPosition>
    	<Position3Value>3</Position3Value>
    </Data>
    					
    les éléments de valeur dans la source XML dont les valeurs fonction de leur position ne figurent pas dans la sortie comme prévu. Le <position3element>élément, cependant, a la valeur correcte car l'expression qui est utilisée dans la feuille de style pour récupérer il utilise la fonction de position dans un prédicat (au lieu de directement comme un argument de fonction XSLT).

  7. Fermez Output.xml, puis ouvrez la feuille de style Repro.xsl.
  8. Remplacer la <xsl:for-each>bloc qui est utilisé pour générer le contenu de la <valuesthatmatchposition>élément avec le code suivant pour stocker le résultat de la position fonction XPath dans une variable XSLT et fournir la variable en tant que valeur de paramètre dans l'appel de la fonction XSLT clé :
    <xsl:for-each select="value">
       <xsl:variable name="pos" select="position()"/>			
       <xsl:if test="key('Values',$pos)">
                <value><xsl:value-of select="."/></value>   		    
       </xsl:if>	   
    </xsl:for-each>
    					
  9. Enregistrer les modifications à la feuille de style et puis réexécutez le projet. Lorsque vous affichez le contenu de Output.xml, vous voyez le code XML suivant :
    <?xml version="1.0" encoding="utf-8"?>
    <Data>
    	<ValuesThatMatchPosition>
    		<value>1</value>
    		<value>2</value>
    		<value>3</value>
    		<value>5</value>
    		<value>7</value>
    	</ValuesThatMatchPosition>
    	<Position3Value>3</Position3Value>
    </Data>
    					
    la sortie répertorie désormais les éléments de valeur dans le code XML dont les valeurs fonction de leur position source.

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft .NET Framework 1.0
Mots-clés : 
kbmt kbbug kbpending KB324033 KbMtfr
Traduction automatiqueTraduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 324033  (http://support.microsoft.com/kb/324033/en-us/ )
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
 

Traductions disponibles

 

Related Support Centers