2010-02-04 4 views
1

J'ai du mal à déclencher une action xsl uniquement sur des valeurs distinctes. Voici un extrait de mon fichier XML:Ne faire quelque chose que sur des nœuds XML distincts

<?xml version="1.0" encoding="UTF-8" ?> 
<Doc Data="February 2010"> 
    <Title>Title 1</Title> 
    <Subject>Subject 1</Subject> 
</Doc> 
<Doc Data="January 2010"> 
    <Title>Title 2</Title> 
    <Subject>Subject 2</Subject> 
</Doc> 
<Doc Data="January 2010"> 
    <Title>Title 3</Title> 
    <Subject>Subject 3</Subject> 
</Doc> 

Et voici mon fichier xsl:

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       xmlns:objUtility="urn:utility" 
       version="1.0"> 
<xsl:output method="html" indent="no" encoding="ISO-8859-1"/> 

    <xsl:template match="Doc"> 
    <xsl:if test="not(@Data = preceding-sibling::Doc/@Data)"> 
     <xsl:value-of select="@Data" /> 
    </xsl:if> 
    </xsl:template> 

<xsl:apply-templates /> 

Le problème est que, avec ce code, le preceding-sibling :: Doc/@ élément de données toujours contient SEULEMENT LE PREMIER élément, donc fondamentalement je reçois une valeur distincte seulement pour février et non pour janvier. Où ai-je tort? Je dois utiliser XSL 1.0

+0

Votre exemple de code fonctionne pour moi, en imprimant "Février 2010" 'et' "Janvier 2010" '. – Tomalak

+0

Vraiment étrange, je reçois tous les éléments à la place (février testé contre rien, et les deux janvier testé contre février) ... –

+1

Je ne vois aucun problème avec votre extrait de feuille de style, mais si vous avez quelque chose ne fonctionne pas comme prévu pour fournir des échantillons minimes mais complets qui permettent aux autres de reproduire le problème. Avez-vous vraiment un fragment affiché comme votre contribution? A quoi ressemble la feuille de style complète? –

Répondre

1

Si vous souhaitez demander: « Y at-il frère précédent de type Doc avec un attribut de données égal à l'attribut de données du noeud courant? », Le XPath pour cela devrait ressembler à

<xsl:if test="not(preceding-sibling::Doc[@Data = current()/@Data])"> 
Questions connexes