/* * namespaces.c: Implementation of the XSLT namespaces handling * * Reference: * http://www.w3.org/TR/1999/REC-xslt-19991116 * * See Copyright for the status of this software. * * [email protected] */ #define IN_LIBXSLT #include "libxslt.h" #include <string.h> #ifndef XSLT_NEED_TRIO #include <stdio.h> #else #include <trio.h> #endif #include <libxml/xmlmemory.h> #include <libxml/tree.h> #include <libxml/hash.h> #include <libxml/xmlerror.h> #include <libxml/uri.h> #include "xslt.h" #include "xsltInternals.h" #include "xsltutils.h" #include "namespaces.h" #include "imports.h" /************************************************************************ * * * Module interfaces * * * ************************************************************************/ #ifdef XSLT_REFACTORED static xsltNsAliasPtr xsltNewNsAlias(xsltCompilerCtxtPtr cctxt) { xsltNsAliasPtr ret; if (cctxt == NULL) return(NULL); ret = (xsltNsAliasPtr) xmlMalloc(sizeof(xsltNsAlias)); if (ret == NULL) { xsltTransformError(NULL, cctxt->style, NULL, "Internal error in xsltNewNsAlias(): Memory allocation failed.\n"); cctxt->style->errors++; return(NULL); } memset(ret, 0, sizeof(xsltNsAlias)); /* * TODO: Store the item at current stylesheet-level. */ ret->next = cctxt->nsAliases; cctxt->nsAliases = ret; return(ret); } #endif /* XSLT_REFACTORED */ /** * xsltNamespaceAlias: * @style: the XSLT stylesheet * @node: the xsl:namespace-alias node * * Read the stylesheet-prefix and result-prefix attributes, register * them as well as the corresponding namespace. */ void xsltNamespaceAlias(xsltStylesheetPtr style, xmlNodePtr node) { … } /** * xsltGetSpecialNamespace: * @ctxt: the transformation context * @invocNode: the invoking node; e.g. a literal result element/attr; * only used for error reports * @nsName: the namespace name (or NULL) * @nsPrefix: the suggested namespace prefix (or NULL) * @target: the result element on which to anchor a namespace * * Find a matching (prefix and ns-name) ns-declaration * for the requested @nsName and @nsPrefix in the result tree. * If none is found then a new ns-declaration will be * added to @resultElem. If, in this case, the given prefix is * already in use, then a ns-declaration with a modified ns-prefix * be we created. Note that this function's priority is to * preserve ns-prefixes; it will only change a prefix if there's * a namespace clash. * If both @nsName and @nsPrefix are NULL, then this will try to * "undeclare" a default namespace by declaring an xmlns="". * * Returns a namespace declaration or NULL. */ xmlNsPtr xsltGetSpecialNamespace(xsltTransformContextPtr ctxt, xmlNodePtr invocNode, const xmlChar *nsName, const xmlChar *nsPrefix, xmlNodePtr target) { … } /** * xsltGetNamespace: * @ctxt: a transformation context * @cur: the input node * @ns: the namespace * @out: the output node (or its parent) * * Find a matching (prefix and ns-name) ns-declaration * for the requested @ns->prefix and @ns->href in the result tree. * If none is found then a new ns-declaration will be * added to @resultElem. If, in this case, the given prefix is * already in use, then a ns-declaration with a modified ns-prefix * be we created. * * Called by: * - xsltCopyPropList() (*not* anymore) * - xsltShallowCopyElement() * - xsltCopyTreeInternal() (*not* anymore) * - xsltApplySequenceConstructor() (*not* in the refactored code), * - xsltElement() (*not* anymore) * * Returns a namespace declaration or NULL in case of * namespace fixup failures or API or internal errors. */ xmlNsPtr xsltGetNamespace(xsltTransformContextPtr ctxt, xmlNodePtr cur, xmlNsPtr ns, xmlNodePtr out) { … } /** * xsltGetPlainNamespace: * @ctxt: a transformation context * @cur: the input node * @ns: the namespace * @out: the result element * * Obsolete. * *Not* called by any Libxslt/Libexslt function. * Exaclty the same as xsltGetNamespace(). * * Returns a namespace declaration or NULL in case of * namespace fixup failures or API or internal errors. */ xmlNsPtr xsltGetPlainNamespace(xsltTransformContextPtr ctxt, xmlNodePtr cur, xmlNsPtr ns, xmlNodePtr out) { … } /** * xsltCopyNamespaceList: * @ctxt: a transformation context * @node: the target node * @cur: the first namespace * * Do a copy of an namespace list. If @node is non-NULL the * new namespaces are added automatically. This handles namespaces * aliases. * This function is intended only for *internal* use at * transformation-time for copying ns-declarations of Literal * Result Elements. * * Called by: * xsltCopyTreeInternal() (transform.c) * xsltShallowCopyElem() (transform.c) * * REVISIT: This function won't be used in the refactored code. * * Returns: a new xmlNsPtr, or NULL in case of error. */ xmlNsPtr xsltCopyNamespaceList(xsltTransformContextPtr ctxt, xmlNodePtr node, xmlNsPtr cur) { … } /** * xsltCopyNamespace: * @ctxt: a transformation context * @elem: the target element node * @ns: the namespace node * * Copies a namespace node (declaration). If @elem is not NULL, * then the new namespace will be declared on @elem. * * Returns: a new xmlNsPtr, or NULL in case of an error. */ xmlNsPtr xsltCopyNamespace(xsltTransformContextPtr ctxt ATTRIBUTE_UNUSED, xmlNodePtr elem, xmlNsPtr ns) { … } /** * xsltFreeNamespaceAliasHashes: * @style: an XSLT stylesheet * * Free up the memory used by namespaces aliases */ void xsltFreeNamespaceAliasHashes(xsltStylesheetPtr style) { … }