00001 /* 00002 * The Apache Software License, Version 1.1 00003 * 00004 * 00005 * Copyright (c) 1999-2004 The Apache Software Foundation. All rights 00006 * reserved. 00007 * 00008 * Redistribution and use in source and binary forms, with or without 00009 * modification, are permitted provided that the following conditions 00010 * are met: 00011 * 00012 * 1. Redistributions of source code must retain the above copyright 00013 * notice, this list of conditions and the following disclaimer. 00014 * 00015 * 2. Redistributions in binary form must reproduce the above copyright 00016 * notice, this list of conditions and the following disclaimer in 00017 * the documentation and/or other materials provided with the 00018 * distribution. 00019 * 00020 * 3. The end-user documentation included with the redistribution, 00021 * if any, must include the following acknowledgment: 00022 * "This product includes software developed by the 00023 * Apache Software Foundation (http://www.apache.org/)." 00024 * Alternately, this acknowledgment may appear in the software itself, 00025 * if and wherever such third-party acknowledgments normally appear. 00026 * 00027 * 4. The names "Xalan" and "Apache Software Foundation" must 00028 * not be used to endorse or promote products derived from this 00029 * software without prior written permission. For written 00030 * permission, please contact apache@apache.org. 00031 * 00032 * 5. Products derived from this software may not be called "Apache", 00033 * nor may "Apache" appear in their name, without prior written 00034 * permission of the Apache Software Foundation. 00035 * 00036 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 00037 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00038 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00039 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 00040 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00041 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 00042 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 00043 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 00044 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00045 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 00046 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00047 * SUCH DAMAGE. 00048 * ==================================================================== 00049 * 00050 * This software consists of voluntary contributions made by many 00051 * individuals on behalf of the Apache Software Foundation and was 00052 * originally based on software copyright (c) 1999, International 00053 * Business Machines, Inc., http://www.ibm.com. For more 00054 * information on the Apache Software Foundation, please see 00055 * <http://www.apache.org/>. 00056 */ 00057 #if !defined(DOMSERVICES_HEADER_GUARD_1357924680) 00058 #define DOMSERVICES_HEADER_GUARD_1357924680 00059 00060 00061 00062 // Base include file. Must be first. 00063 #include <xalanc/DOMSupport/DOMSupportDefinitions.hpp> 00064 00065 00066 00067 #include <xalanc/XalanDOM/XalanDOMString.hpp> 00068 #include <xalanc/XalanDOM/XalanAttr.hpp> 00069 #include <xalanc/XalanDOM/XalanComment.hpp> 00070 #include <xalanc/XalanDOM/XalanDocument.hpp> 00071 #include <xalanc/XalanDOM/XalanElement.hpp> 00072 #include <xalanc/XalanDOM/XalanProcessingInstruction.hpp> 00073 #include <xalanc/XalanDOM/XalanText.hpp> 00074 00075 00076 00077 #include <xalanc/PlatformSupport/DOMStringHelper.hpp> 00078 #include <xalanc/PlatformSupport/FormatterListener.hpp> 00079 00080 00081 00082 XALAN_CPP_NAMESPACE_BEGIN 00083 00084 00085 00086 class XalanDocument; 00087 class XalanDocumentFragment; 00088 00089 00090 00091 class XALAN_DOMSUPPORT_EXPORT DOMServices 00092 { 00093 public: 00094 00095 static const XalanDOMString& s_XMLString; 00096 static const XalanDOMString& s_XMLStringWithSeparator; 00097 static const XalanDOMString& s_XMLNamespacePrefix; 00098 static const XalanDOMString& s_XMLNamespaceURI; 00099 static const XalanDOMString& s_XMLNamespace; 00100 static const XalanDOMString& s_XMLNamespaceWithSeparator; 00101 static const XalanDOMString& s_XMLNamespaceSeparatorString; 00102 static const XalanDOMString& s_XMLNamespacePrefixURI; 00103 00104 static const XalanDOMString::size_type& s_XMLStringLength; 00105 static const XalanDOMString::size_type& s_XMLStringWithSeparatorLength; 00106 static const XalanDOMString::size_type& s_XMLNamespacePrefixLength; 00107 static const XalanDOMString::size_type& s_XMLNamespaceURILength; 00108 static const XalanDOMString::size_type& s_XMLNamespaceLength; 00109 static const XalanDOMString::size_type& s_XMLNamespaceWithSeparatorLength; 00110 static const XalanDOMString::size_type& s_XMLNamespaceSeparatorStringLength; 00111 static const XalanDOMString::size_type& s_XMLNamespacePrefixURILength; 00112 00113 00114 // A dummy string to return when we need an emtpy string... 00115 static const XalanDOMString s_emptyString; 00116 00117 00122 static void 00123 initialize(); 00124 00129 static void 00130 terminate(); 00131 00138 static XalanDOMString 00139 getNodeData(const XalanNode& node); 00140 00147 static void 00148 getNodeData( 00149 const XalanNode& node, 00150 XalanDOMString& data); 00151 00158 static XalanDOMString 00159 getNodeData(const XalanAttr& attribute) 00160 { 00161 return attribute.getNodeValue(); 00162 } 00163 00170 static void 00171 getNodeData( 00172 const XalanAttr& attribute, 00173 XalanDOMString& data) 00174 { 00175 append(data, attribute.getNodeValue()); 00176 } 00177 00184 static XalanDOMString 00185 getNodeData(const XalanComment& comment) 00186 { 00187 return comment.getData(); 00188 } 00189 00196 static void 00197 getNodeData( 00198 const XalanComment& comment, 00199 XalanDOMString& data) 00200 { 00201 append(data, comment.getData()); 00202 } 00203 00210 static XalanDOMString 00211 getNodeData(const XalanDocument& document); 00212 00219 static void 00220 getNodeData( 00221 const XalanDocument& document, 00222 XalanDOMString& data); 00223 00230 static XalanDOMString 00231 getNodeData(const XalanDocumentFragment& documentFragment); 00232 00239 static void 00240 getNodeData( 00241 const XalanDocumentFragment& documentFragment, 00242 XalanDOMString& data); 00243 00250 static XalanDOMString 00251 getNodeData(const XalanElement& element); 00252 00259 static void 00260 getNodeData( 00261 const XalanElement& element, 00262 XalanDOMString& data); 00263 00270 static XalanDOMString 00271 getNodeData(const XalanProcessingInstruction& pi) 00272 { 00273 return pi.getData(); 00274 } 00275 00282 static void 00283 getNodeData( 00284 const XalanProcessingInstruction& pi, 00285 XalanDOMString& data) 00286 { 00287 append(data, pi.getData()); 00288 } 00289 00296 static XalanDOMString 00297 getNodeData(const XalanText& text) 00298 { 00299 return text.getData(); 00300 } 00301 00308 static void 00309 getNodeData( 00310 const XalanText& text, 00311 XalanDOMString& data) 00312 { 00313 append(data, text.getData()); 00314 } 00315 00316 typedef void (FormatterListener::*MemberFunctionPtr)(const XMLCh* const, const unsigned int); 00317 00325 static void 00326 getNodeData( 00327 const XalanNode& node, 00328 FormatterListener& formatterListener, 00329 MemberFunctionPtr function); 00330 00338 static void 00339 getNodeData( 00340 const XalanAttr& attribute, 00341 FormatterListener& formatterListener, 00342 MemberFunctionPtr function) 00343 { 00344 sendData(formatterListener, function, attribute.getNodeValue()); 00345 } 00346 00354 static void 00355 getNodeData( 00356 const XalanComment& comment, 00357 FormatterListener& formatterListener, 00358 MemberFunctionPtr function) 00359 { 00360 sendData(formatterListener, function, comment.getData()); 00361 } 00362 00370 static void 00371 getNodeData( 00372 const XalanDocument& document, 00373 FormatterListener& formatterListener, 00374 MemberFunctionPtr function); 00375 00383 static void 00384 getNodeData( 00385 const XalanDocumentFragment& documentFragment, 00386 FormatterListener& formatterListener, 00387 MemberFunctionPtr function); 00388 00396 static void 00397 getNodeData( 00398 const XalanElement& element, 00399 FormatterListener& formatterListener, 00400 MemberFunctionPtr function); 00401 00409 static void 00410 getNodeData( 00411 const XalanProcessingInstruction& pi, 00412 FormatterListener& formatterListener, 00413 MemberFunctionPtr function) 00414 { 00415 sendData(formatterListener, function, pi.getData()); 00416 } 00417 00425 static void 00426 getNodeData( 00427 const XalanText& text, 00428 FormatterListener& formatterListener, 00429 MemberFunctionPtr function) 00430 { 00431 sendData(formatterListener, function, text.getData()); 00432 } 00433 00442 static const XalanDOMString& 00443 getNameOfNode(const XalanNode& n); 00444 00453 static const XalanDOMString& 00454 getNameOfNode(const XalanAttr& attr) 00455 { 00456 const XalanDOMString& theName = attr.getNodeName(); 00457 00458 if (startsWith(theName, s_XMLNamespaceWithSeparator) == true) 00459 { 00460 // Special case for namespace nodes... 00461 return attr.getLocalName(); 00462 } 00463 else if (equals(theName, s_XMLNamespace) == true) 00464 { 00465 return s_emptyString; 00466 } 00467 else 00468 { 00469 return theName; 00470 } 00471 } 00472 00481 static const XalanDOMString& 00482 getNameOfNode(const XalanElement& element) 00483 { 00484 return element.getNodeName(); 00485 } 00486 00495 static const XalanDOMString& 00496 getLocalNameOfNode(const XalanNode& n) 00497 { 00498 const XalanDOMString& theLocalName = n.getLocalName(); 00499 00500 if (length(theLocalName) != 0) 00501 { 00502 return theLocalName; 00503 } 00504 else 00505 { 00506 return n.getNodeName(); 00507 } 00508 } 00509 00518 static const XalanDOMString& 00519 getNamespaceOfNode(const XalanNode& n); 00520 00528 static bool 00529 isNamespaceDeclaration(const XalanAttr& n) 00530 { 00531 const XalanDOMString& theName = n.getNodeName(); 00532 00533 return startsWith(theName, DOMServices::s_XMLNamespaceWithSeparator) == true || 00534 equals(theName, DOMServices::s_XMLNamespace) == true; 00535 } 00536 00544 static XalanNode* 00545 getParentOfNode(const XalanNode& node) 00546 { 00547 if(node.getNodeType() == XalanNode::ATTRIBUTE_NODE) 00548 { 00549 #if defined(XALAN_OLD_STYLE_CASTS) 00550 return ((const XalanAttr&)node).getOwnerElement(); 00551 #else 00552 return static_cast<const XalanAttr&>(node).getOwnerElement(); 00553 #endif 00554 } 00555 else 00556 { 00557 return node.getParentNode(); 00558 } 00559 } 00560 00568 static const XalanDOMString* 00569 getNamespaceForPrefix( 00570 const XalanDOMString& prefix, 00571 const XalanElement& namespaceContext); 00572 00583 static const XalanDOMString* 00584 getNamespaceForPrefix( 00585 const XalanDOMChar* theName, 00586 const PrefixResolver& thePrefixResolver, 00587 bool isAttribute, 00588 XalanDOMString& thePrefix); 00589 00597 static bool 00598 isNodeAfter( 00599 const XalanNode& node1, 00600 const XalanNode& node2); 00601 00610 static bool 00611 isNodeAfterSibling( 00612 const XalanNode& parent, 00613 const XalanNode& child1, 00614 const XalanNode& child2); 00615 00616 private: 00617 00628 static XalanNode* 00629 findOwnerElement(const XalanAttr& attr) 00630 { 00631 XalanNode* const theOwnerElement = attr.getOwnerElement(); 00632 00633 if (theOwnerElement != 0) 00634 { 00635 return theOwnerElement; 00636 } 00637 else 00638 { 00639 return findOwnerElement(attr, *attr.getOwnerDocument()->getDocumentElement()); 00640 } 00641 } 00642 00654 static XalanNode* 00655 findOwnerElement( 00656 const XalanNode& attr, 00657 XalanNode& element); 00658 00666 static void 00667 sendData( 00668 FormatterListener& formatterListener, 00669 MemberFunctionPtr function, 00670 const XalanDOMString& data) 00671 { 00672 assert(length(data) == FormatterListener::size_type(length(data))); 00673 00674 (formatterListener.*function)(c_wstr(data), FormatterListener::size_type(length(data))); 00675 } 00676 }; 00677 00678 00679 00680 XALAN_CPP_NAMESPACE_END 00681 00682 00683 00684 #endif // DOMSERVICES_HEADER_GUARD_1357924680
Doxygen and GraphViz are used to generate this API documentation from the Xalan-C header files.
![]() |
Xalan-C++ XSLT Processor Version 1.7 |
|