XObjectPtr FunctionFormatNumber::execute( XPathExecutionContext& executionContext, XalanNode* context, const XObjectPtr arg1, const XObjectPtr arg2, const XObjectPtr arg3, const LocatorType* locator) const { assert(arg1.null() == false && arg2.null() == false && arg3.null() == false); const double theNumber = arg1->num(); const XalanDOMString& thePattern = arg2->str(); const XalanDOMString& theDFSName = arg3->str(); assert(length(theDFSName) != 0); typedef XPathExecutionContext::GetAndReleaseCachedString GetAndReleaseCachedString; GetAndReleaseCachedString theString(executionContext); executionContext.formatNumber( theNumber, thePattern, theDFSName, theString.get(), context, locator); return executionContext.getXObjectFactory().createString(theString); }
XObjectPtr FunctionSubstringBefore::execute( XPathExecutionContext& executionContext, XalanNode* /* context */, const XObjectPtr arg1, const XObjectPtr arg2, const LocatorType* /* locator */) const { assert(arg1.null() == false && arg2.null() == false); const XalanDOMString& theFirstString = arg1->str(); const XalanDOMString::size_type theFirstStringLength = length(theFirstString); if (theFirstStringLength == 0) { return createEmptyString(executionContext); } else { const XalanDOMString& theSecondString = arg2->str(); const XalanDOMString::size_type theSecondStringLength = length(theSecondString); if (theSecondStringLength == 0) { return createEmptyString(executionContext); } else { const XalanDOMString::size_type theIndex = indexOf(theFirstString, theSecondString); if (theIndex == theFirstStringLength) { return createEmptyString(executionContext); } else { XPathExecutionContext::GetAndReleaseCachedString theResult(executionContext); XalanDOMString& theString = theResult.get(); theString.assign( toCharArray(theFirstString), theIndex); // Create a string of the appropriate length... return executionContext.getXObjectFactory().createString(theResult); } } } }
XObjectPtr FunctionSubstring::execute( XPathExecutionContext& executionContext, XalanNode* context, const XObjectPtr arg1, const XObjectPtr arg2, const LocatorType* locator) const { assert(arg1.null() == false && arg2.null() == false); return execute(executionContext, context, arg1, arg2, s_nullXObjectPtr, locator); }
/* * Get the total of the second and third arguments. */ inline double getTotal( XalanDOMString::size_type theSourceStringLength, double theSecondArgValue, const XObjectPtr& arg3) { // Total the second and third arguments. If the third argument is // missing, make it the length of the string + 1 (for XPath // indexing style). if (arg3.null() == true) { return double(theSourceStringLength + 1); } else { const double theRoundedValue = DoubleSupport::round(DoubleSupport::add(theSecondArgValue, arg3->num())); // If there's overflow, then we should return the length of the string + 1. if (DoubleSupport::isPositiveInfinity(theRoundedValue) == true) { return double(theSourceStringLength + 1); } else { return theRoundedValue; } } }
XObjectPtr CExternalFunction::execute( XPathExecutionContext& executionContext, XalanNode* /* context */, const XObjectPtr arg1, const Locator* /* locator */) const { assert(arg1.null() == false); const XalanDOMString& arg = arg1->str(); //convert XalanDOMString (implemented as unsigned short*) into StringBuffer StringBuffer sbInput; sbInput.ensureCapacity(arg.length()+1); size32_t len = arg.length(); for (size32_t i=0; i < len; i++) sbInput.append( (char) arg[i]); StringBuffer sbOutput; try { (*m_userFunction)(sbOutput, sbInput.str(), m_pTransform); } catch (IException* e) { StringBuffer msg; e->errorMessage(msg); e->Release(); } catch (...) { } XalanDOMString xdsOutput( sbOutput.str() ); return executionContext.getXObjectFactory().createString( xdsOutput ); }
XObjectPtr FunctionStartsWith::execute( XPathExecutionContext& executionContext, XalanNode* /* context */, const XObjectPtr arg1, const XObjectPtr arg2, const Locator* const /* locator */) const { assert(arg1.null() == false && arg2.null() == false); const bool fStartsWith = startsWith( arg1->str(executionContext), arg2->str(executionContext)); return executionContext.getXObjectFactory().createBoolean(fStartsWith); }
XObjectPtr FunctionLang::execute( XPathExecutionContext& executionContext, XalanNode* context, const XObjectPtr arg1, const LocatorType* /* locator */) const { assert(arg1.null() == false); const XalanNode* parent = context; bool fMatch = false; const XalanDOMString& lang = arg1->str(); while(0 != parent) { if(XalanNode::ELEMENT_NODE == parent->getNodeType()) { const XalanElement* const theElementNode = #if defined(XALAN_OLD_STYLE_CASTS) (const XalanElement*)parent; #else static_cast<const XalanElement*>(parent); #endif const XalanDOMString& langVal = theElementNode->getAttributeNS( DOMServices::s_XMLNamespaceURI, s_attributeName); if(0 != length(langVal)) { XPathExecutionContext::GetAndReleaseCachedString theGuard1(executionContext); XPathExecutionContext::GetAndReleaseCachedString theGuard2(executionContext); if(startsWith(toLowerCaseASCII(langVal, theGuard1.get()), toLowerCaseASCII(lang, theGuard2.get()))) { const XalanDOMString::size_type valLen = length(lang); if(length(langVal) == valLen || charAt(langVal, valLen) == XalanUnicode::charHyphenMinus) { fMatch = true; break; } } } } parent = DOMServices::getParentOfNode(*parent); } return executionContext.getXObjectFactory().createBoolean(fMatch); }
XObjectPtr FunctionElementAvailable::execute( XPathExecutionContext& executionContext, XalanNode* /* context */, const XObjectPtr arg1, const LocatorType* locator) const { assert(arg1.null() == false); return executionContext.getXObjectFactory().createBoolean( executionContext.elementAvailable(arg1->str(), locator)); }
XObjectPtr FunctionSample::execute( XPathExecutionContext& executionContext, XalanNode* /* context */, const XObjectPtr arg1, const XObjectPtr arg2, const Locator* /* locator */) const { assert(arg1.null() == false); assert(arg2.null() == false); XalanDOMString path; arg1->str(path); const bool bLinux = arg2->boolean(); XalanDOMChar dchOld; XalanDOMChar dchNew; if (bLinux) { dchOld = '\\'; dchNew = '/'; } else { dchOld = '/'; dchOld = '\\'; } int len = path.length(); for (int i=0; i<len; i++) if (path[i] == dchOld) path[i] = dchNew; return executionContext.getXObjectFactory().createString(path); }
XObjectPtr FunctionGenerateID::execute( XPathExecutionContext& executionContext, XalanNode* /* context */, const XObjectPtr arg1, const LocatorType* locator) const { assert(arg1.null() == false); const NodeRefListBase& theNodeList = arg1->nodeset(); if (theNodeList.getLength() == 0) { return executionContext.getXObjectFactory().createStringReference(s_emptyString); } else { return execute(executionContext, theNodeList.item(0), locator); } }
XObjectPtr FunctionString::execute( XPathExecutionContext& executionContext, XalanNode* /* context */, const XObjectPtr arg1, const LocatorType* /* locator */) const { assert(arg1.null() == false); if (arg1->getType() == XObject::eTypeString) { // Since XObjects are reference counted, just return the // argument. return arg1; } else { return executionContext.getXObjectFactory().createStringAdapter(arg1); } }
void ElemVariable::execute(StylesheetExecutionContext& executionContext) const { assert(m_qname != 0); ParentType::execute(executionContext); const XObjectPtr theValue(getValue(executionContext, executionContext.getCurrentNode())); if (theValue.null() == false) { executionContext.pushVariable( *m_qname, theValue, getParentNodeElem()); } else { executionContext.pushVariable( *m_qname, this, getParentNodeElem()); } }
void ElemForEach::selectAndSortChildren( StylesheetExecutionContext& executionContext, const ElemTemplateElement* theTemplate, NodeSorter* sorter, int selectStackFrameIndex) const { typedef StylesheetExecutionContext::SetAndRestoreCurrentStackFrameIndex SetAndRestoreCurrentStackFrameIndex; assert(m_selectPattern != 0); typedef XPathExecutionContext::BorrowReturnMutableNodeRefList BorrowReturnMutableNodeRefList; BorrowReturnMutableNodeRefList theGuard(executionContext); const NodeRefListBase* sourceNodes = 0; XObjectPtr xobjectResult; { SetAndRestoreCurrentStackFrameIndex theSetAndRestore( executionContext, selectStackFrameIndex); xobjectResult = m_selectPattern->execute( *this, executionContext, *theGuard); if (xobjectResult.null() == true) { sourceNodes = &*theGuard; } else { theGuard.release(); sourceNodes = &xobjectResult->nodeset(); } } if(0 != executionContext.getTraceListeners()) { executionContext.fireSelectEvent( SelectionEvent( executionContext, executionContext.getCurrentNode(), *this, StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("select")), *m_selectPattern, *sourceNodes)); } const NodeRefListBase::size_type nNodes = sourceNodes->getLength(); if (nNodes > 0) { // If there's not NodeSorter, or we've only selected one node, // then just do the transform... if (sorter == 0 || nNodes == 1) { transformSelectedChildren( executionContext, theTemplate, *sourceNodes, nNodes); } else { typedef StylesheetExecutionContext::SetAndRestoreCurrentStackFrameIndex SetAndRestoreCurrentStackFrameIndex; typedef StylesheetExecutionContext::ContextNodeListPushAndPop ContextNodeListPushAndPop; typedef StylesheetExecutionContext::BorrowReturnMutableNodeRefList BorrowReturnMutableNodeRefList; BorrowReturnMutableNodeRefList sortedSourceNodes(executionContext); *sortedSourceNodes = *sourceNodes; { SetAndRestoreCurrentStackFrameIndex theStackFrameSetAndRestore( executionContext, selectStackFrameIndex); ContextNodeListPushAndPop theContextNodeListPushAndPop( executionContext, *sourceNodes); sorter->sort(executionContext, *sortedSourceNodes); } transformSelectedChildren( executionContext, theTemplate, *sortedSourceNodes, nNodes); } } }
XalanNode* FindContextNode( XPathProcessor& theXPathProcessor, XPathEnvSupport& theXPathEnvSupport, DOMSupport& theDOMSupport, XPathFactory& theXPathFactory, XalanDocument* theDocument, const XalanDOMString& theContextNodeMatchPattern, PrintWriter& thePrintWriter, XPathExecutionContext& theExecutionContext) { XalanNode* theResult = 0; MemoryManagerType& theMemoryManager = theExecutionContext.getMemoryManager(); XPath* const theXPath = theXPathFactory.create(); XPathConstructionContextDefault theXPathConstructionContext; XPathGuard theGuard( theXPathFactory, theXPath); XalanElement* theNamespaceContext = 0; ElementPrefixResolverProxy thePrefixResolver(theNamespaceContext, theXPathEnvSupport, theDOMSupport); NodeRefList theContextNodeList(theMemoryManager); const XObjectPtr theXObject = ExecuteXPath( theXPathProcessor, theXPathConstructionContext, *theXPath, theContextNodeMatchPattern, theDocument, thePrefixResolver, theContextNodeList, theExecutionContext); try { assert(theXObject.null() == false); const NodeRefListBase& theResultList = theXObject->nodeset(); if (theResultList.getLength() == 0) { thePrintWriter.print("FindContextNode: Unable to find context node using select \""); thePrintWriter.print(theContextNodeMatchPattern); thePrintWriter.println("\"."); thePrintWriter.println("FindContextNode: No nodes matched the pattern."); } else if (theResultList.getLength() != 1) { thePrintWriter.print("FindContextNode: Unable to find context node using select \""); thePrintWriter.print(theContextNodeMatchPattern); thePrintWriter.println("\"."); thePrintWriter.println("FindContextNode: More than one node matched the pattern."); } else { theResult = theResultList.item(0); } } catch(...) { thePrintWriter.print("FindContextNode: Error executing match pattern \""); thePrintWriter.print(theContextNodeMatchPattern); thePrintWriter.println("\"."); } return theResult; }
const XObjectPtr VariablesStack::findXObject( const XalanQName& name, StylesheetExecutionContext& executionContext, bool fIsParam, bool fSearchGlobalSpace, bool& fNameFound) { typedef VariableStackStackType::size_type size_type; // findEntry() returns an index into the stack. We should // _never_ take the address of anything in the stack, since // the address could change at unexpected times. const size_type theEntryIndex = findEntry(name, fIsParam, fSearchGlobalSpace); if (theEntryIndex == m_stack.size()) { fNameFound = false; return XObjectPtr(); } else { assert(theEntryIndex < m_stack.size()); fNameFound = true; assert(m_stack[theEntryIndex].getType() == StackEntry::eVariable || m_stack[theEntryIndex].getType() == StackEntry::eParam || m_stack[theEntryIndex].getType() == StackEntry::eActiveParam); const XObjectPtr& theValue = m_stack[theEntryIndex].getValue(); if (theValue.null() == false) { return theValue; } else { const ElemVariable* const var = m_stack[theEntryIndex].getVariable(); XObjectPtr theNewValue; if (var != 0) { XalanNode* const doc = executionContext.getRootDocument(); assert(doc != 0); XALAN_USING_STD(find) // See if the ElemVariable instance is already being evaluated... if (find(m_guardStack.begin(), m_guardStack.end(), var) != m_guardStack.end()) { const StylesheetExecutionContext::GetCachedString theGuard(executionContext); executionContext.error( XalanMessageLoader::getMessage( theGuard.get(), XalanMessages::CircularVariableDefWasDetected), doc, var->getLocator()); } m_guardStack.push_back(var); #if !defined(XALAN_RECURSIVE_STYLESHEET_EXECUTION) executionContext.pushContextMarker(); #else // We need to set up a stack frame for the variable's execution... typedef StylesheetExecutionContext::PushAndPopContextMarker PushAndPopContextMarker; const PushAndPopContextMarker theContextMarkerPushPop(executionContext); #endif theNewValue = var->getValue(executionContext, doc); assert(theNewValue.null() == false); #if !defined(XALAN_RECURSIVE_STYLESHEET_EXECUTION) executionContext.popContextMarker(); #endif assert(m_guardStack.empty() == false); m_guardStack.pop_back(); m_stack[theEntryIndex].setValue(theNewValue); m_stack[theEntryIndex].activate(); } return theNewValue; } }
bool TestPredicateResult( XPathProcessor& theXPathProcessor, XPathEnvSupport& theXPathEnvSupport, DOMSupport& theDOMSupport, XMLParserLiaison& theLiaison, XPathFactory& theXPathFactory, const XalanDOMString& theXMLFileURL, const XalanDOMString& theXSLFileURL, PrintWriter& thePrintWriter, XPathExecutionContext& theExecutionContext) { bool fError = false; XalanDocument* const theXMLDocument = ParseXML(theLiaison, theXMLFileURL); MemoryManagerType& theMemoryManager = theExecutionContext.getMemoryManager(); if (theXMLDocument != 0) { XalanDOMString theContextNodeMatchPattern(theMemoryManager); XalanDOMString theXPathString(theMemoryManager); if (GetXSLInput(theLiaison, theXSLFileURL, theContextNodeMatchPattern, theXPathString, theMemoryManager) == true) { XalanNode* const theContextNode = FindContextNode(theXPathProcessor, theXPathEnvSupport, theDOMSupport, theXPathFactory, theXMLDocument, theContextNodeMatchPattern, thePrintWriter, theExecutionContext); if (theContextNode != 0) { XalanElement* const theNamespaceContext = 0; ElementPrefixResolverProxy thePrefixResolver(theNamespaceContext, theXPathEnvSupport, theDOMSupport); NodeRefList theContextNodeList(theMemoryManager); XPath* const theXPath1 = theXPathFactory.create(); XPathConstructionContextDefault theXPathConstructionContext(theMemoryManager); XPathGuard theGuard1(theXPathFactory, theXPath1); XalanDOMString theResult(theMemoryManager); theXPathProcessor.initXPath(*theXPath1, theXPathConstructionContext, TranscodeFromLocalCodePage("following-sibling::*", theResult), thePrefixResolver); XPath* const theXPath2 = theXPathFactory.create(); XPathGuard theGuard2(theXPathFactory, theXPath2); theXPathProcessor.initXPath(*theXPath2, theXPathConstructionContext, TranscodeFromLocalCodePage("descendant::*", theResult), thePrefixResolver); bool fDump = false; if (fDump == true) { thePrintWriter.println(); thePrintWriter.println(); theXPath1->getExpression().dumpOpCodeMap(thePrintWriter); thePrintWriter.println(); theXPath1->getExpression().dumpTokenQueue(thePrintWriter); thePrintWriter.println(); thePrintWriter.println(); theXPath2->getExpression().dumpOpCodeMap(thePrintWriter); thePrintWriter.println(); theXPath2->getExpression().dumpTokenQueue(thePrintWriter); thePrintWriter.println(); thePrintWriter.println(); } XalanNode* theContextNode = theXMLDocument->getFirstChild()->getFirstChild(); for( ; theContextNode != 0; theContextNode = theContextNode->getNextSibling()) { if (theContextNode->getNodeType() != XalanNode::ELEMENT_NODE) { continue; } const XObjectPtr theResult1 = theXPath1->execute(theExecutionContext); try { assert(theResult1.null() == false); const NodeRefListBase& theResultList = theResult1->nodeset(); const unsigned int theLength = theResultList.getLength(); thePrintWriter.print("theResult1->str() == \""); thePrintWriter.print(theResult1->str()); thePrintWriter.print("\""); thePrintWriter.println(); if (theLength > 0) { for (unsigned int i = 0; i < theLength; i++) { thePrintWriter.print(theResultList.item(i)->getNodeName()); thePrintWriter.println(); } } } catch(...) { thePrintWriter.print("Execution of XPath "); thePrintWriter.print(theXPathString); thePrintWriter.println(" failed!"); } const XObjectPtr theResult2 = theXPath2->execute(theExecutionContext); try { assert(theResult2.null() == false); const NodeRefListBase& theResultList = theResult2->nodeset(); const int theLength = theResultList.getLength(); thePrintWriter.print("theResult2->str() == \""); thePrintWriter.print(theResult2->str()); thePrintWriter.print("\""); thePrintWriter.println(); if (theLength > 0) { for (int i = 0; i < theLength; i++) { thePrintWriter.print(theResultList.item(i)->getNodeName()); thePrintWriter.println(); } } } catch(...) { thePrintWriter.print("Execution of XPath "); thePrintWriter.print(theXPathString); thePrintWriter.println(" failed!"); } if (theResult1->equals(*theResult2, theExecutionContext) == true) { thePrintWriter.print("theResult1 is equal to theResult2"); thePrintWriter.println(); thePrintWriter.print("theContextNode->getNodeName() == \""); thePrintWriter.print(theContextNode->getNodeName()); thePrintWriter.print("\" theContextNode->getNodeValue() == \""); thePrintWriter.print(theContextNode->getNodeValue()); thePrintWriter.println("\""); } } } } } return fError; }
bool TestAxisResult( XPathProcessor& theXPathProcessor, XPathEnvSupport& theXPathEnvSupport, DOMSupport& theDOMSupport, XMLParserLiaison& theLiaison, XPathFactory& theXPathFactory, const XalanDOMString& theXMLFileURL, const XalanDOMString& theXSLFileURL, PrintWriter& thePrintWriter, XPathExecutionContext& theExecutionContext) { bool fError = false; XalanDocument* const theXMLDocument = ParseXML(theLiaison, theXMLFileURL); MemoryManagerType& theMemoryManager = theExecutionContext.getMemoryManager(); if (theXMLDocument != 0) { XalanDOMString theContextNodeMatchPattern(theMemoryManager); XalanDOMString theXPathString(theMemoryManager); if (GetXSLInput(theLiaison, theXSLFileURL, theContextNodeMatchPattern, theXPathString, theMemoryManager) == true) { XalanNode* const theContextNode = FindContextNode(theXPathProcessor, theXPathEnvSupport, theDOMSupport, theXPathFactory, theXMLDocument, theContextNodeMatchPattern, thePrintWriter, theExecutionContext); if (theContextNode != 0) { XalanElement* const theNamespaceContext = 0; ElementPrefixResolverProxy thePrefixResolver(theNamespaceContext, theXPathEnvSupport, theDOMSupport); NodeRefList theContextNodeList(theMemoryManager); XPath* const theXPath = theXPathFactory.create(); XPathConstructionContextDefault theXPathConstructionContext(theMemoryManager); XPathGuard theGuard(theXPathFactory, theXPath); theXPathProcessor.initXPath(*theXPath, theXPathConstructionContext, theXPathString, thePrefixResolver); bool fDump = false; if (fDump == true) { thePrintWriter.println(); thePrintWriter.println(); theXPath->getExpression().dumpOpCodeMap(thePrintWriter); thePrintWriter.println(); theXPath->getExpression().dumpTokenQueue(thePrintWriter); thePrintWriter.println(); thePrintWriter.println(); } const XObjectPtr theResult = theXPath->execute(theContextNode, thePrefixResolver, theContextNodeList, theExecutionContext); try { assert(theResult.null() == false); const NodeRefListBase& theResultList = theResult->nodeset(); const unsigned int theLength = theResultList.getLength(); if (theLength == 0) { thePrintWriter.println("<out/>"); } else { thePrintWriter.print("<out>"); for (unsigned int i = 0; i < theLength; i++) { thePrintWriter.print(theResultList.item(i)->getNodeName()); thePrintWriter.print(" "); } thePrintWriter.println("</out>"); } } catch(...) { thePrintWriter.print("Execution of XPath "); thePrintWriter.print(theXPathString); thePrintWriter.println(" failed!"); } } } } theLiaison.reset(); return fError; }
XObjectPtr FunctionSubstring::execute( XPathExecutionContext& executionContext, XalanNode* /* context */, const XObjectPtr arg1, const XObjectPtr arg2, const XObjectPtr arg3, const LocatorType* /* locator */) const { assert(arg1.null() == false && arg2.null() == false); const XalanDOMString& theSourceString = arg1->str(); const XalanDOMString::size_type theSourceStringLength = length(theSourceString); if (theSourceStringLength == 0) { return createEmptyString(executionContext); } else { // Get the value of the second argument... const double theSecondArgValue = DoubleSupport::round(arg2->num()); // XPath indexes from 1, so this is the first XPath index.... const XalanDOMString::size_type theStartIndex = getStartIndex(theSecondArgValue, theSourceStringLength); if (theStartIndex >= theSourceStringLength) { return createEmptyString(executionContext); } else { const double theTotal = getTotal(theSourceStringLength, theSecondArgValue, arg3); if (DoubleSupport::isNaN(theSecondArgValue) == true || DoubleSupport::isNaN(theTotal) == true || DoubleSupport::isNegativeInfinity(theTotal) == true || theTotal == 0.0 || theTotal < double(theStartIndex)) { return createEmptyString(executionContext); } else { const XalanDOMString::size_type theSubstringLength = getSubstringLength( theSourceStringLength, theStartIndex, theTotal); XPathExecutionContext::GetAndReleaseCachedString theResult(executionContext); XalanDOMString& theString = theResult.get(); assign( theString, toCharArray(theSourceString) + theStartIndex, theSubstringLength); return executionContext.getXObjectFactory().createString(theResult); } } } }
XObjectPtr FunctionSubstringAfter::execute( XPathExecutionContext& executionContext, XalanNode* /* context */, const XObjectPtr arg1, const XObjectPtr arg2, const LocatorType* /* locator */) const { assert(arg1.null() == false && arg2.null() == false); const XalanDOMString& theFirstString = arg1->str(); const XalanDOMString::size_type theFirstStringLength = length(theFirstString); if (theFirstStringLength == 0) { return createEmptyString(executionContext); } else { const XalanDOMString& theSecondString = arg2->str(); const XalanDOMString::size_type theSecondStringLength = length(theSecondString); if (theSecondStringLength == 0) { return arg1; } else { const XalanDOMString::size_type theIndex = indexOf(theFirstString, theSecondString); if (theIndex == theFirstStringLength) { return createEmptyString(executionContext); } else { const XalanDOMString::size_type theSecondStringLength = length(theSecondString); // Find the first character, which will be the offset of the index of the // beginning of the second string, plus the length of the second string. const XalanDOMChar* const theFirstCharacter = toCharArray(theFirstString) + theIndex + theSecondStringLength; // The remaining length is just the opposite -- the length of the string, // minus the index, minus the length of the second string. const XalanDOMString::size_type theSubstringLength = theFirstStringLength - theIndex - theSecondStringLength; XPathExecutionContext::GetAndReleaseCachedString theResult(executionContext); XalanDOMString& theString = theResult.get(); assign( theString, theFirstCharacter, theSubstringLength); return executionContext.getXObjectFactory().createString(theResult); } } } }