Env:
W2K, J2SDK 1.4.2_03 (bundled Xalan Java 2.4.1), Eclipse 3.0
A saved node:
<xsl:for-each select="child::s:menuItem">
...
<xsl:copy-of select="menuNodes:addNode($newTreePath,.)" />
<!-- $newTreePath: a ref string -->
<xsl:for-each>
Can be retrieved only once:
<xsl:for-each select="menuNodes:getNode(0)">
text[getNode(0)-1]:[<xsl:value-of select="s:text" />]<br/>
</xsl:for-each>
<xsl:for-each select="menuNodes:getNode(0)">
text[getNode(0)-2]:[<xsl:copy-of select="s:text" />]<br/>
</xsl:for-each>
The second test (<xsl:for-each select�) does not retrieve anything.
Where (menuNodes: ) :
public DTMNodeIterator getNode(int nodeIdx) {
return ((MsMenuNode)menuNodes.get(nodeIdx)).node;
}
public void addNode(String menuPath, Object nodeObject) {
if (nodeObject instanceof DTMNodeIterator) {
DTMNodeIterator node = (DTMNodeIterator) nodeObject;
menuNodes.add(new MsMenuNode(menuPath, node));
} else {
throw new RuntimeException("NOT_IMPLEMENTED");
}
}
Vector menuNodes;
private class MsMenuNode {
String menuPath;
DTMNodeIterator node;
MsMenuNode(String menuPath, DTMNodeIterator node) {
this.menuPath = menuPath;
this.node = node;
}
}
I tried clone and cloneWithReset as well:
public DTMNodeIterator getNode(int nodeIdx) {
DTMIterator newIterator;
DTMNodeIterator di = ((MsMenuNode) menuNodes.get(nodeIdx)).node;
try {
newIterator = (DTMIterator) di.getDTMIterator().cloneWithReset();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return new DTMNodeIterator(newIterator);
}
The Java code does not affect main translation. The test:
<xsl:template match="*//s:menuItem">
text:<xsl:value-of select="s:text"/><br/>
</xsl:template>
properly returns all "text" values at any time.
I have notoiced changes in DTMNodeIterator:
XNodeSet dtm_iter;
dtm_iter.m_last;
dtm_iter.m_next;
have been incremented by one, every time XSLT code:
<xsl:for-each select="menuNodes:getNode(0)">
text[getNode(0)-1]:[<xsl:value-of select="s:text" />]<br/>
</xsl:for-each>
has been executed, even "newIterator" has been cloned (w/wo reset).
newIterator = (DTMIterator) di.getDTMIterator().cloneWithReset();
Is it possible to do a deep clone, or there is another way to preserve a node.
Tnx,
Vk
_______________________________________________
Join Excite! - http://www.excite.com
The most personalized portal on the Web!