2010-12-03 12 views
1

Ich habe einige XSLT, die ich nicht geschrieben habe, aber ich muss es pflegen. An einigen Stellen benutzt man generate-id(), um ein leeres div zu erzeugen, das dann von einem Skript weiter bearbeitet wird. Das Problem ist, dass das div sich in einem anderen div befindet (ich dachte, das wäre ein bisschen sinnlos, aber trotzdem akzeptabel) und beide bekommen die gleiche id! Ich habe das mit Xalan und dann wieder mit dem JRE-Transformer mit dem gleichen Ergebnis versucht. Ich habe dann versucht, die Eclipse/Xalan XSLT-Debugger zu verwenden, und wenn ich über die Sache verlasse, es funktioniert alles richtig ...Warum gibt die Funktion generate-id() dieselbe ID zweimal zurück?

Die XSLT wie folgt aussieht:

<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> 

Und das XML-Fragment ist wie dies:

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

Ich weiß, das ist ein bisschen kompliziert - irgendwelche Hinweise? Bitte?

+0

Ihre Aussage, dass Sie falsche Ergebnisse erhalten können nicht reproed werden, wenn Sie ein vollständiges XML-Dokument (so gering wie möglich) zur Verfügung stellen und eine komplette XSLT-Transformation (so minimal wie möglich). Bitte geben Sie diese an, oder Ihre Frage ist nicht wirklich eine Frage, die beantwortet werden kann. –

+0

Was ist das von Ihnen gepostete XML-Fragment? Wenn es das Ergebnis ist, wurde es nicht mit diesem XSLT-Code erzeugt, da dieser 'div's mit' id' erzeugt, aber nicht 'div' im Ergebnis. – khachik

+0

@Dimitre - ok Ich dachte, jemand könnte in etwas Ähnliches geraten sein, um mit generate-id unter ähnlichen Umständen zu tun. Sowohl XML als auch XSLT laufen über 10k Zeilen, aber ich werde ein minimales Beispiel erstellen. – jambox

Antwort

4

Das Problem ist in dem Code, den Sie uns nicht zeigen.

generate-id() Funktion einen eindeutigen Identifikator für die Zeichenfolge Argument Knoten oder dem Kontextknoten zurückgeben sonst.

Also, es ist einzigartig für eindeutige Knoten ... Sie rufen wahrscheinlich die P/0-Funktion in zwei Content-Vorlage mit dem gleichen Kontext-Knoten. Wie ist das möglich? Nun ...

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

call-template Anweisung nicht den Kontextknoten ändern

+0

Ja, das war es genau! Alles, was ich tun musste, war hinzuzufügen den Knotennamen zum Aufruf wie: generate-id (aufgeführt) - simplez. Was mich dazu brachte war, wie Xalan im Debug-Modus nicht das gleiche Verhalten zeigte! Ich denke, es gibt irgendwo ein Problem mit dem Kontext ... – jambox

+0

@jjbox: Ich bin froh, dass es hilfreich war, frage jederzeit. –