2010-12-03 4 views
1

J'ai un XSLT que je n'ai pas écrit mais je dois le maintenir. À certains moments, il utilise generate-id() pour créer un div vide qui est ensuite manipulé par un script plus loin. Le problème est que la div est à l'intérieur d'une autre div (j'avais pensé que c'était un peu inutile, mais acceptable de toute façon) et les deux reçoivent le même identifiant! J'ai essayé ceci avec Xalan et ensuite avec le transformateur JRE avec le même résultat. J'ai ensuite essayé d'utiliser le débogueur XSLT Eclipse/Xalan et quand je suis Enjambant la chose, tout cela fonctionne correctement ...Pourquoi la fonction generate-id() renvoie-t-elle le même identifiant deux fois?

Le XSLT ressemble à ceci:

<xsl:template match="listed"> 
    <xsl:variable name="showwhat"> 
     <xsl:call-template name="IdentifyAudience"/> 
    </xsl:variable> 
    <xsl:if test="string-length($showwhat) &gt; 0"> 
     <div> 
      <xsl:attribute name="id"> 
       <xsl:value-of select="generate-id()"/> 
      </xsl:attribute> 
      <xsl:call-template name="Blah"/> 
      <xsl:apply-templates/> 
     </div> 
    </xsl:if> 
</xsl:template> 

et le fragment XML est comme ceci:

<listed id='ID39AF705AE17A000F337B000A' mode='html'> 
    <ul> 
     <li>Blah blah</li> 
    </ul> 
</listed> 
<listed id='ID39AF715892AE000F337B002B' mode='html'> 
    <ul> 
     <li>Blech blech.</li> 
    </ul> 
</listed> 

J'apprécie c'est un peu compliqué - des indices? S'il vous plaît?

+0

Votre déclaration que vous obtenez des résultats incorrects ne peuvent pas être reproed sauf si vous fournissez un document XML complet (aussi minime que possible) et complète Transformation XSLT (aussi minimale que possible). S'il vous plaît, fournissez-les, ou votre question n'est pas vraiment une question à laquelle on peut répondre. –

+0

Quel est le fragment XML que vous avez publié? Si c'est le résultat, il n'a pas été généré avec ce code XSLT, puisque celui-ci génère 'div's avec' id' mais il n'y a pas 'div' dans le résultat. – khachik

+0

@Dimitre - ok Je pensais que quelqu'un aurait pu avoir quelque chose de similaire à faire avec generate-id dans des circonstances similaires. Le XML et le XSLT fonctionnent tous les deux sur des lignes de 10k, mais je vais produire un exemple minimal. – jambox

Répondre

4

Le problème est dans le code que vous n'avez pas montré pour nous.

fonction generate-id() retourner une chaîne d'identifiant unique pour noeud d'argument ou le nœud de contexte autrement. Donc, c'est unique pour un nœud unique ... Vous appelez probablement la fonction p/0 dans deux modèles de contenu avec le même nœud de contexte. Comment est-ce possible? Eh bien ...

<xsl:call-template name="Blah"/> 

call-template instruction ne change pas le nœud de contexte

+0

Oui, c'était exactement ça! Tout ce que j'avais à faire était d'ajouter le nom du noeud à appeler comme: generate-id (listée) - simplez. Ce qui m'a lancé, c'est comment Xalan en mode débogage n'a pas montré le même comportement! Je suppose qu'il y a un problème avec le contexte quelque part ... – jambox

+0

@jambox: Je suis content que cela ait été utile, demandez n'importe quand. –

Questions connexes