/** * Create a psuedo variable reference that will represent the * shared redundent XPath, for a local reduction. * * @param uniquePseudoVarName The name of the new variable. * @param psuedoVarRecipient The broadest scope of where the variable * should be inserted, usually an xsl:template or xsl:for-each. * @param lpi The LocationPathIterator that the variable should represent. * @return null if the decl was not created, otherwise the new Pseudo var * element. */ protected ElemVariable createLocalPseudoVarDecl(QName uniquePseudoVarName, ElemTemplateElement psuedoVarRecipient, LocPathIterator lpi) throws org.w3c.dom.DOMException { ElemVariable psuedoVar = new ElemVariablePsuedo(); XPath xpath = new XPath(lpi); psuedoVar.setSelect(xpath); psuedoVar.setName(uniquePseudoVarName); ElemVariable var = addVarDeclToElem(psuedoVarRecipient, lpi, psuedoVar); lpi.exprSetParent(var); return var; }
getElemFromExpression(next.m_exprOwner.getExpression()); elems[i] = elem; int numAncestors = countAncestors(elem); ancestorCounts[i] = numAncestors; if(numAncestors < shortestAncestorCount) if(areEqual && isNotSameAsOwner(head, first) && first.canAcceptVariables()) assertion(false, "Could not find common ancestor!!!"); return null;
if(partialIsVariable(testee, lengthToTest)) return head; MultistepExprHolder matchedPaths = null; if (stepsEqual(iter1, iter2, lengthToTest)) if(null != matchedPaths) ElemTemplateElement root = isGlobal ? varScope : findCommonAncestor(matchedPaths); WalkingIterator sharedIter = (WalkingIterator)matchedPaths.m_exprOwner.getExpression(); WalkingIterator newIter = createIteratorFromSteps(sharedIter, lengthToTest); ElemVariable var = createPseudoVarDecl(root, newIter, isGlobal); if(DIAGNOSE_MULTISTEPLIST) System.err.println("Created var: "+var.getName()+(isGlobal ? "(Global)" : "")); changePartToRef(var.getName(), iter, lengthToTest, isGlobal); owner.setExpression(newIter2);
MultistepExprHolder list = createMultistepExprList(paths); if(null != list) list = matchAndEliminatePartialPaths(next, list, isGlobal, i, psuedoVarRecipient); next = next.m_next;
/** * Create a psuedo variable reference that will represent the * shared redundent XPath, and add it to the stylesheet. * * @param psuedoVarRecipient The broadest scope of where the variable * should be inserted, usually an xsl:template or xsl:for-each. * @param lpi The LocationPathIterator that the variable should represent. * @param isGlobal true if the paths are global. * @return The new psuedo var element. */ protected ElemVariable createPseudoVarDecl( ElemTemplateElement psuedoVarRecipient, LocPathIterator lpi, boolean isGlobal) throws org.w3c.dom.DOMException { QName uniquePseudoVarName = new QName (PSUEDOVARNAMESPACE, "#"+getPseudoVarID()); if(isGlobal) { return createGlobalPseudoVarDecl(uniquePseudoVarName, (StylesheetRoot)psuedoVarRecipient, lpi); } else return createLocalPseudoVarDecl(uniquePseudoVarName, psuedoVarRecipient, lpi); }
ElemVariable var = createPseudoVarDecl(psuedoVarRecipient, lpi, isGlobal); if(null == var) return 0; uniquePseudoVarName = var.getName(); changeToVarRef(uniquePseudoVarName, firstOccuranceOwner, paths, psuedoVarRecipient); changeToVarRef(uniquePseudoVarName, owner2, paths, psuedoVarRecipient); ElemVariable var = createPseudoVarDecl(psuedoVarRecipient, lpi, true); if(null == var) return 0; uniquePseudoVarName = var.getName(); changeToVarRef(uniquePseudoVarName, firstOccuranceOwner, paths, psuedoVarRecipient); paths.setElementAt(var.getSelect(), firstOccuranceIndex); numPathsFound++;
boolean isGlobal = (paths == m_absPaths); LocPathIterator lpi = (LocPathIterator)expr1; int stepCount = countSteps(lpi); for(int j = start; j < n; j++) ElemTemplateElement root = isGlobal ? psuedoVarRecipient : findCommonAncestor(head); LocPathIterator sharedIter = (LocPathIterator)head.m_exprOwner.getExpression(); ElemVariable var = createPseudoVarDecl(root, sharedIter, isGlobal); if(DIAGNOSE_MULTISTEPLIST) System.err.println("Created var: "+var.getName()+(isGlobal ? "(Global)" : "")); if(DIAGNOSE_MULTISTEPLIST) diagnoseLineNumber(owner.getExpression()); changeToVarRef(uniquePseudoVarName, owner, paths, root); head = head.m_next;
/** * Create a MultistepExprHolder. * * @param exprOwner the owner of the expression we are holding. * It must hold a LocationPathIterator. * @param stepCount The number of steps in the location path. */ MultistepExprHolder(ExpressionOwner exprOwner, int stepCount, MultistepExprHolder next) { m_exprOwner = exprOwner; assertion(null != m_exprOwner, "exprOwner can not be null!"); m_stepCount = stepCount; m_next = next; }
int numPaths = countSteps(lpi); if(numPaths > 1)
var.setIsGlobal(isGlobal); if(isGlobal) { ElemTemplateElement elem = getElemFromExpression(wi); StylesheetRoot root = elem.getStylesheetRoot(); Vector vars = root.getVariablesAndParamsComposed(); for(int i = 0; i < numSteps; i++) assertion(null != walker, "Walker should not be null!"); walker = walker.getNextWalker();
boolean isGlobal = (paths == m_absPaths); LocPathIterator lpi = (LocPathIterator)expr1; int stepCount = countSteps(lpi); for(int j = start; j < n; j++) ElemTemplateElement root = isGlobal ? psuedoVarRecipient : findCommonAncestor(head); LocPathIterator sharedIter = (LocPathIterator)head.m_exprOwner.getExpression(); ElemVariable var = createPseudoVarDecl(root, sharedIter, isGlobal); if(DIAGNOSE_MULTISTEPLIST) System.err.println("Created var: "+var.getName()+(isGlobal ? "(Global)" : "")); if(DIAGNOSE_MULTISTEPLIST) diagnoseLineNumber(owner.getExpression()); changeToVarRef(uniquePseudoVarName, owner, paths, root); head = head.m_next;
/** * Create a psuedo variable reference that will represent the * shared redundent XPath, and add it to the stylesheet. * * @param psuedoVarRecipient The broadest scope of where the variable * should be inserted, usually an xsl:template or xsl:for-each. * @param lpi The LocationPathIterator that the variable should represent. * @param isGlobal true if the paths are global. * @return The new psuedo var element. */ protected ElemVariable createPseudoVarDecl( ElemTemplateElement psuedoVarRecipient, LocPathIterator lpi, boolean isGlobal) throws org.w3c.dom.DOMException { QName uniquePseudoVarName = new QName (PSUEDOVARNAMESPACE, "#"+getPseudoVarID()); if(isGlobal) { return createGlobalPseudoVarDecl(uniquePseudoVarName, (StylesheetRoot)psuedoVarRecipient, lpi); } else return createLocalPseudoVarDecl(uniquePseudoVarName, psuedoVarRecipient, lpi); }
MultistepExprHolder list = createMultistepExprList(paths); if(null != list) list = matchAndEliminatePartialPaths(next, list, isGlobal, i, psuedoVarRecipient); next = next.m_next;
ElemVariable var = createPseudoVarDecl(psuedoVarRecipient, lpi, isGlobal); if(null == var) return 0; uniquePseudoVarName = var.getName(); changeToVarRef(uniquePseudoVarName, firstOccuranceOwner, paths, psuedoVarRecipient); changeToVarRef(uniquePseudoVarName, owner2, paths, psuedoVarRecipient); ElemVariable var = createPseudoVarDecl(psuedoVarRecipient, lpi, true); if(null == var) return 0; uniquePseudoVarName = var.getName(); changeToVarRef(uniquePseudoVarName, firstOccuranceOwner, paths, psuedoVarRecipient); paths.setElementAt(var.getSelect(), firstOccuranceIndex); numPathsFound++;
/** * Create a MultistepExprHolder. * * @param exprOwner the owner of the expression we are holding. * It must hold a LocationPathIterator. * @param stepCount The number of steps in the location path. */ MultistepExprHolder(ExpressionOwner exprOwner, int stepCount, MultistepExprHolder next) { m_exprOwner = exprOwner; assertion(null != m_exprOwner, "exprOwner can not be null!"); m_stepCount = stepCount; m_next = next; }
int numPaths = countSteps(lpi); if(numPaths > 1)
var.setIsGlobal(isGlobal); if(isGlobal) { ElemTemplateElement elem = getElemFromExpression(wi); StylesheetRoot root = elem.getStylesheetRoot(); Vector vars = root.getVariablesAndParamsComposed(); for(int i = 0; i < numSteps; i++) assertion(null != walker, "Walker should not be null!"); walker = walker.getNextWalker();
if(partialIsVariable(testee, lengthToTest)) return head; MultistepExprHolder matchedPaths = null; if (stepsEqual(iter1, iter2, lengthToTest)) if(null != matchedPaths) ElemTemplateElement root = isGlobal ? varScope : findCommonAncestor(matchedPaths); WalkingIterator sharedIter = (WalkingIterator)matchedPaths.m_exprOwner.getExpression(); WalkingIterator newIter = createIteratorFromSteps(sharedIter, lengthToTest); ElemVariable var = createPseudoVarDecl(root, newIter, isGlobal); if(DIAGNOSE_MULTISTEPLIST) System.err.println("Created var: "+var.getName()+(isGlobal ? "(Global)" : "")); changePartToRef(var.getName(), iter, lengthToTest, isGlobal); owner.setExpression(newIter2);
getElemFromExpression(next.m_exprOwner.getExpression()); elems[i] = elem; int numAncestors = countAncestors(elem); ancestorCounts[i] = numAncestors; if(numAncestors < shortestAncestorCount) if(areEqual && isNotSameAsOwner(head, first) && first.canAcceptVariables()) assertion(false, "Could not find common ancestor!!!"); return null;
boolean isGlobal = (paths == m_absPaths); LocPathIterator lpi = (LocPathIterator)expr1; int stepCount = countSteps(lpi); for(int j = start; j < n; j++) ElemTemplateElement root = isGlobal ? psuedoVarRecipient : findCommonAncestor(head); LocPathIterator sharedIter = (LocPathIterator)head.m_exprOwner.getExpression(); ElemVariable var = createPseudoVarDecl(root, sharedIter, isGlobal); if(DIAGNOSE_MULTISTEPLIST) System.err.println("Created var: "+var.getName()+(isGlobal ? "(Global)" : "")); if(DIAGNOSE_MULTISTEPLIST) diagnoseLineNumber(owner.getExpression()); changeToVarRef(uniquePseudoVarName, owner, paths, root); head = head.m_next;