- There are a number of language bindings and wrappers available for libxml2,
-the list below is not exhaustive. Please contact the xml-bindings@gnome.org
+ There are a number of language bindings and wrappers available for
+libxml2, the list below is not exhaustive. Please contact the xml-bindings@gnome.org
(archives) in
order to get updates to this list or to discuss the specific topic of libxml2
or libxslt wrappers or bindings:
diff --git a/doc/xml.html b/doc/xml.html
index b80a56a4..d87962d5 100644
--- a/doc/xml.html
+++ b/doc/xml.html
@@ -58,7 +58,8 @@ languages:
In most cases libxml tries to implement the specifications in a relatively
-strictly compliant way. As of release 2.4.16, libxml2 passes all 1800+ tests from the OASIS XML Tests
Suite.
@@ -159,9 +160,9 @@ libxml2
wording
Can I embed libxml in a proprietary application ?
- Yes. The MIT License allows you to keep proprietary the changes
- you made to libxml, but it would be graceful to send-back bug fixes
- and improvements as patches for possible incorporation in the main
+ Yes. The MIT License allows you to keep proprietary the changes you
+ made to libxml, but it would be graceful to send-back bug fixes and
+ improvements as patches for possible incorporation in the main
development tree.
@@ -182,8 +183,8 @@ libxml2
I see libxml and libxml2 releases, which one should I install ?
- - If you are not constrained by backward compatibility issues
- with existing applications, install libxml2 only
+ - If you are not constrained by backward compatibility issues with
+ existing applications, install libxml2 only
- If you are not doing development, you can safely install both.
Usually the packages libxml and
- I can't install the libxml package, it conflicts with libxml0
You probably have an old libxml0 package used to provide the shared
- library for libxml.so.0, you can probably safely remove it. The
- libxml packages provided on rpmfind.net provide
libxml.so.0
@@ -212,9 +213,9 @@ libxml2
The most generic solution is to re-fetch the latest src.rpm , and
rebuild it locally with
rpm --rebuild libxml(2)-xxx.src.rpm .
- If everything goes well it will generate two binary rpm packages (one providing
- the shared libs and xmllint, and the other one, the -devel package,
- providing includes, static libraries and scripts needed to build
+ If everything goes well it will generate two binary rpm packages (one
+ providing the shared libs and xmllint, and the other one, the -devel
+ package, providing includes, static libraries and scripts needed to build
applications with libxml(2)) that you can install locally.
@@ -253,16 +254,17 @@ libxml2
Make check fails on some platforms
- Sometimes the regression tests' results don't completely match the value
- produced by the parser, and the makefile uses diff to print the delta. On
- some platforms the diff return breaks the compilation process; if the
- diff is small this is probably not a serious problem.
+ Sometimes the regression tests' results don't completely match the
+ value produced by the parser, and the makefile uses diff to print the
+ delta. On some platforms the diff return breaks the compilation process;
+ if the diff is small this is probably not a serious problem.
Sometimes (especially on Solaris) make checks fail due to limitations
in make. Try using GNU-make instead.
I use the CVS version and there is no configure script
- The configure script (and other Makefiles) are generated. Use the autogen.sh
- script to regenerate the configure script and Makefiles, like:
+ The configure script (and other Makefiles) are generated. Use the
+ autogen.sh script to regenerate the configure script and Makefiles,
+ like:
./autogen.sh --prefix=/usr --disable-shared
I have troubles when running make tests with gcc-3.0
@@ -345,8 +347,8 @@ pnode=pxmlDoc->children->children;
Check the previous points 1/ and 2/ raised before, and please send
patches.
- Where can I get more examples and information than privoded on the web
- page?
+ Where can I get more examples and information than privoded on the
+ web page?
Ideally a libxml book would be nice. I have no such plan ... But you
can:
@@ -363,9 +365,9 @@ pnode=pxmlDoc->children->children;
- Browse
the libxml source , I try to write code as clean and documented
- as possible, so looking at it may be helpful. In particular the code of
- xmllint.c and of the various testXXX.c test programs should provide
- good examples of how to do things with the library.
+ as possible, so looking at it may be helpful. In particular the code
+ of xmllint.c and of the various testXXX.c test programs should
+ provide good examples of how to do things with the library.
What about C++ ?
@@ -388,8 +390,8 @@ pnode=pxmlDoc->children->children;
How to validate a document a posteriori ?
It is possible to validate documents which had not been validated at
- initial parsing time or documents which have been built from scratch using
- the API. Use the xmlValidateDtd()
function. It is also possible to simply add a DTD to an existing
document:
@@ -430,9 +432,9 @@ xmlDtdPtr dtd = xmlParseDTD(NULL, filename_of_dtd); /* parse the DTD */
for IBM developerWorks about using libxml.
Check the TODO
file.
- Read the 1.x to 2.x upgrade path description. If you are
- starting a new project using libxml you should really use the 2.x
- version.
+ Read the 1.x to 2.x upgrade path
+ description. If you are starting a new project using libxml you should
+ really use the 2.x version.
And don't forget to look at the mailing-list archive.
@@ -442,9 +444,9 @@ xmlDtdPtr dtd = xmlParseDTD(NULL, filename_of_dtd); /* parse the DTD */
Well, bugs or missing features are always possible, and I will make a
point of fixing them in a timely fashion. The best way to report a bug is to
use the Gnome
-bug tracking database (make sure to use the "libxml2" module name). I look
-at reports there regularly and it's good to have a reminder when a bug is
-still open. Be sure to specify that the bug is for the package libxml2.
+bug tracking database (make sure to use the "libxml2" module name). I
+look at reports there regularly and it's good to have a reminder when a bug
+is still open. Be sure to specify that the bug is for the package libxml2.
There is also a mailing-list xml@gnome.org for libxml, with an :
and
Provide documentation fixes (either as patches to the code comments or
as HTML diffs).
- Provide new documentations pieces (translations, examples, etc ...).
+ Provide new documentations pieces (translations, examples, etc
+ ...).
Check the TODO file and try to close one of the items.
Take one of the points raised in the archive or the bug database and
provide a fix. Get in touch with me
@@ -531,7 +534,9 @@ maintainer of the Windows port, he
provides binaries. Gary
Pennington provides Solaris
-binaries. Steve Ball provides Mac Os X binaries.
+binaries. Steve Ball provides
+Mac Os X
+binaries.
Snapshot:
@@ -572,6 +577,18 @@ to test those
Schemas and XInclude
+2.4.24: Aug 22 2002
+
+ - XPath fixes (William), xf:escape-uri() (Wesley Terpstra)
+ - Python binding fixes: makefiles (William), generator, rpm build, x86-64
+ (fcrozat)
+ - HTML <style> and boolean attributes serializer fixes
+ - C14N improvements by Aleksey
+ - doc cleanups: Rick Jones
+ - Windows compiler makefile updates: Igor and Elizabeth Barham
+ - XInclude: implementation of fallback and xml:base fixup added
+
+
2.4.23: July 6 2002
- performances patches: Peter Jacobi
@@ -1370,19 +1387,20 @@ document:
</EXAMPLE>
The first line specifies that it is an XML document and gives useful
-information about its encoding. Then the rest of the document is a text format whose
-structure is specified by tags between brackets. Each tag opened has
-to be closed. XML is pedantic about this. However, if a tag is empty
-(no content), a single tag can serve as both the opening and closing tag if
-it ends with /> rather than with > . Note
-that, for example, the image tag has no content (just an attribute) and is
-closed by ending the tag with /> .
+information about its encoding. Then the rest of the document is a text
+format whose structure is specified by tags between brackets. Each
+tag opened has to be closed. XML is pedantic about this. However, if
+a tag is empty (no content), a single tag can serve as both the opening and
+closing tag if it ends with /> rather than with
+> . Note that, for example, the image tag has no content (just
+an attribute) and is closed by ending the tag with /> .
-XML can be applied successfully to a wide range of tasks, ranging from long term
-structured document maintenance (where it follows the steps of SGML) to
-simple data encoding mechanisms like configuration file formatting (glade),
-spreadsheets (gnumeric), or even shorter lived documents such as WebDAV where
-it is used to encode remote calls between a client and a server.
+XML can be applied successfully to a wide range of tasks, ranging from
+long term structured document maintenance (where it follows the steps of
+SGML) to simple data encoding mechanisms like configuration file formatting
+(glade), spreadsheets (gnumeric), or even shorter lived documents such as
+WebDAV where it is used to encode remote calls between a client and a
+server.
@@ -1392,8 +1410,8 @@ it is used to encode remote calls between a client and a server.
language for transforming XML documents into other XML documents (or
HTML/textual output).
-A separate library called libxslt is being developed on top of libxml2. This
-module "libxslt" too can be found in the Gnome CVS base.
+A separate library called libxslt is being developed on top of libxml2.
+This module "libxslt" too can be found in the Gnome CVS base.
You can check the features
@@ -1403,8 +1421,8 @@ name="Changelog">Changelog.
-There are a number of language bindings and wrappers available for libxml2,
-the list below is not exhaustive. Please contact the There are a number of language bindings and wrappers available for
+libxml2, the list below is not exhaustive. Please contact the xml-bindings@gnome.org
(archives) in
order to get updates to this list or to discuss the specific topic of libxml2
@@ -1897,8 +1915,8 @@ of the XML life cycle. Briefly a DTD defines all the possible elements to be
found within your document, what is the formal shape of your document tree
(by defining the allowed content of an element; either text, a regular
expression for the allowed list of children, or mixed content i.e. both text
-and children). The DTD also defines the valid attributes for all elements
-and the types of those attributes.
+and children). The DTD also defines the valid attributes for all elements and
+the types of those attributes.
@@ -1917,10 +1935,10 @@ ancient...
-Writing DTDs can be done in many ways. The rules to build them if you
-need something permanent or something which can evolve over time can be radically
-different. Really complex DTDs like DocBook ones are flexible but quite harder
-to design. I will just focus on DTDs for a formats with a fixed simple
+ Writing DTDs can be done in many ways. The rules to build them if you need
+something permanent or something which can evolve over time can be radically
+different. Really complex DTDs like DocBook ones are flexible but quite
+harder to design. I will just focus on DTDs for a formats with a fixed simple
structure. It is just a set of basic rules, and definitely not exhaustive nor
usable for complex DTD design.
@@ -2027,9 +2045,9 @@ meaning that it is optional, or the default value (possibly prefixed by
The directory test/valid/dtds/ in the libxml distribution
-contains some complex DTD examples. The example in the file test/valid/dia.xml
-shows an XML file where the simple DTD is directly included within
-the document.
+contains some complex DTD examples. The example in the file
+test/valid/dia.xml shows an XML file where the simple DTD is
+directly included within the document.
@@ -2042,8 +2060,8 @@ For example the following validates a copy of the first revision of the XML
the -- noout is used to disable output of the resulting tree.
-The --dtdvalid dtd allows validation of the document(s) against
-a given DTD.
+The --dtdvalid dtd allows validation of the document(s)
+against a given DTD.
Libxml exports an API to handle DTDs and validation, check the associated
@@ -2644,6 +2662,7 @@ xmlOutputBufferCreateOwn(FILE *file, xmlCharEncodingHandlerPtr encoder) {
+
}
- And then use it to save the document:
diff --git a/doc/xmldtd.html b/doc/xmldtd.html
index de4f48ab..d266b8a3 100644
--- a/doc/xmldtd.html
+++ b/doc/xmldtd.html
@@ -116,8 +116,8 @@ of the XML life cycle. Briefly a DTD defines all the possible elements to be
found within your document, what is the formal shape of your document tree
(by defining the allowed content of an element; either text, a regular
expression for the allowed list of children, or mixed content i.e. both text
-and children). The DTD also defines the valid attributes for all elements
-and the types of those attributes.
+and children). The DTD also defines the valid attributes for all elements and
+the types of those attributes.
The W3C XML Recommendation (Tim Bray's annotated version of
Rev1):
@@ -130,10 +130,10 @@ Rev1):
(unfortunately) all this is inherited from the SGML world, the syntax is
ancient...
-Writing DTDs can be done in many ways. The rules to build them if you
-need something permanent or something which can evolve over time can be radically
-different. Really complex DTDs like DocBook ones are flexible but quite harder
-to design. I will just focus on DTDs for a formats with a fixed simple
+ Writing DTDs can be done in many ways. The rules to build them if you need
+something permanent or something which can evolve over time can be radically
+different. Really complex DTDs like DocBook ones are flexible but quite
+harder to design. I will just focus on DTDs for a formats with a fixed simple
structure. It is just a set of basic rules, and definitely not exhaustive nor
usable for complex DTD design.
@@ -218,9 +218,9 @@ meaning that it is optional, or the default value (possibly prefixed by
The directory test/valid/dtds/ in the libxml distribution
-contains some complex DTD examples. The example in the file test/valid/dia.xml
-shows an XML file where the simple DTD is directly included within
-the document.
+contains some complex DTD examples. The example in the file
+test/valid/dia.xml shows an XML file where the simple DTD is
+directly included within the document.
The simplest way is to use the xmllint program included with libxml. The
--valid option turns-on validation of the files given as input.
@@ -228,8 +228,8 @@ For example the following validates a copy of the first revision of the XML
1.0 specification:
xmllint --valid --noout test/valid/REC-xml-19980210.xml
the -- noout is used to disable output of the resulting tree.
-The --dtdvalid dtd allows validation of the document(s) against
-a given DTD.
+The --dtdvalid dtd allows validation of the document(s)
+against a given DTD.
Libxml exports an API to handle DTDs and validation, check the associated
description.
diff --git a/doc/xmlio.html b/doc/xmlio.html
index cf218d9c..e6501611 100644
--- a/doc/xmlio.html
+++ b/doc/xmlio.html
@@ -238,6 +238,7 @@ xmlOutputBufferCreateOwn(FILE *file, xmlCharEncodingHandlerPtr encoder) {
+
}
And then use it to save the document:
diff --git a/include/libxml/xmlwin32version.h b/include/libxml/xmlwin32version.h
index b59b2f6a..937a9f06 100644
--- a/include/libxml/xmlwin32version.h
+++ b/include/libxml/xmlwin32version.h
@@ -27,21 +27,21 @@ extern void xmlCheckVersion(int version);
*
* the version string like "1.2.3"
*/
-#define LIBXML_DOTTED_VERSION "2.4.23"
+#define LIBXML_DOTTED_VERSION "2.4.24"
/**
* LIBXML_VERSION:
*
* the version number: 1.2.3 value is 1002003
*/
-#define LIBXML_VERSION 20423
+#define LIBXML_VERSION 20424
/**
* LIBXML_VERSION_STRING:
*
* the version number string, 1.2.3 value is "1002003"
*/
-#define LIBXML_VERSION_STRING "20423"
+#define LIBXML_VERSION_STRING "20424"
/**
* LIBXML_TEST_VERSION:
@@ -49,7 +49,7 @@ extern void xmlCheckVersion(int version);
* Macro to check that the libxml version in use is compatible with
* the version the software has been compiled against
*/
-#define LIBXML_TEST_VERSION xmlCheckVersion(20423);
+#define LIBXML_TEST_VERSION xmlCheckVersion(20424);
#if 0
/**
diff --git a/parser.c b/parser.c
index 389c399e..a68b3b91 100644
--- a/parser.c
+++ b/parser.c
@@ -9794,7 +9794,7 @@ xmlParseBalancedChunkMemoryRecover(xmlDocPtr doc, xmlSAXHandlerPtr sax,
if (doc == NULL) {
ctxt->myDoc = newDoc;
} else {
- ctxt->myDoc = doc;
+ ctxt->myDoc = newDoc;
newDoc->children->doc = doc;
}
ctxt->instate = XML_PARSER_CONTENT;
diff --git a/python/generator.py b/python/generator.py
index 5533f346..c34949e0 100755
--- a/python/generator.py
+++ b/python/generator.py
@@ -383,6 +383,31 @@ def print_function_wrapper(name, output, export, include):
unknown_types[ret[0]] = [name]
return -1
+ if file == "debugXML":
+ include.write("#ifdef LIBXML_DEBUG_ENABLED\n");
+ export.write("#ifdef LIBXML_DEBUG_ENABLED\n");
+ output.write("#ifdef LIBXML_DEBUG_ENABLED\n");
+ elif file == "HTMLtree" or file == "HTMLparser":
+ include.write("#ifdef LIBXML_HTML_ENABLED\n");
+ export.write("#ifdef LIBXML_HTML_ENABLED\n");
+ output.write("#ifdef LIBXML_HTML_ENABLED\n");
+ elif file == "c14n":
+ include.write("#ifdef LIBXML_C14N_ENABLED\n");
+ export.write("#ifdef LIBXML_C14N_ENABLED\n");
+ output.write("#ifdef LIBXML_C14N_ENABLED\n");
+ elif file == "xpathInternals" or file == "xpath":
+ include.write("#ifdef LIBXML_XPATH_ENABLED\n");
+ export.write("#ifdef LIBXML_XPATH_ENABLED\n");
+ output.write("#ifdef LIBXML_XPATH_ENABLED\n");
+ elif file == "xpointer":
+ include.write("#ifdef LIBXML_XPTR_ENABLED\n");
+ export.write("#ifdef LIBXML_XPTR_ENABLED\n");
+ output.write("#ifdef LIBXML_XPTR_ENABLED\n");
+ elif file == "xinclude":
+ include.write("#ifdef LIBXML_XINCLUDE_ENABLED\n");
+ export.write("#ifdef LIBXML_XINCLUDE_ENABLED\n");
+ output.write("#ifdef LIBXML_XINCLUDE_ENABLED\n");
+
include.write("PyObject * ")
include.write("libxml_%s(PyObject *self, PyObject *args);\n" % (name));
@@ -417,6 +442,30 @@ def print_function_wrapper(name, output, export, include):
output.write(c_call)
output.write(ret_convert)
output.write("}\n\n")
+ if file == "debugXML":
+ include.write("#endif /* LIBXML_DEBUG_ENABLED */\n");
+ export.write("#endif /* LIBXML_DEBUG_ENABLED */\n");
+ output.write("#endif /* LIBXML_DEBUG_ENABLED */\n");
+ elif file == "HTMLtree" or file == "HTMLparser":
+ include.write("#endif /* LIBXML_HTML_ENABLED */\n");
+ export.write("#endif /* LIBXML_HTML_ENABLED */\n");
+ output.write("#endif /* LIBXML_HTML_ENABLED */\n");
+ elif file == "c14n":
+ include.write("#endif /* LIBXML_C14N_ENABLED */\n");
+ export.write("#endif /* LIBXML_C14N_ENABLED */\n");
+ output.write("#endif /* LIBXML_C14N_ENABLED */\n");
+ elif file == "xpathInternals" or file == "xpath":
+ include.write("#endif /* LIBXML_XPATH_ENABLED */\n");
+ export.write("#endif /* LIBXML_XPATH_ENABLED */\n");
+ output.write("#endif /* LIBXML_XPATH_ENABLED */\n");
+ elif file == "xpointer":
+ include.write("#endif /* LIBXML_XPTR_ENABLED */\n");
+ export.write("#endif /* LIBXML_XPTR_ENABLED */\n");
+ output.write("#endif /* LIBXML_XPTR_ENABLED */\n");
+ elif file == "xinclude":
+ include.write("#endif /* LIBXML_XINCLUDE_ENABLED */\n");
+ export.write("#endif /* LIBXML_XINCLUDE_ENABLED */\n");
+ output.write("#endif /* LIBXML_XINCLUDE_ENABLED */\n");
return 1
def buildStubs():
diff --git a/testSchemas.c b/testSchemas.c
index 40c0c8b6..a22c4297 100644
--- a/testSchemas.c
+++ b/testSchemas.c
@@ -49,9 +49,11 @@ int main(int argc, char **argv) {
xmlSchemaPtr schema = NULL;
for (i = 1; i < argc ; i++) {
+#ifdef LIBXML_DEBUG_ENABLED
if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
debug++;
else
+#endif
if ((!strcmp(argv[i], "-noout")) || (!strcmp(argv[i], "--noout"))) {
noout++;
}
@@ -69,8 +71,10 @@ int main(int argc, char **argv) {
stderr);
schema = xmlSchemaParse(ctxt);
xmlSchemaFreeParserCtxt(ctxt);
+#ifdef LIBXML_DEBUG_ENABLED
if (debug)
xmlSchemaDump(stdout, schema);
+#endif
} else {
xmlDocPtr doc;
@@ -109,7 +113,9 @@ int main(int argc, char **argv) {
printf("Usage : %s [--debug] [--noout] schemas XMLfiles ...\n",
argv[0]);
printf("\tParse the HTML files and output the result of the parsing\n");
+#ifdef LIBXML_DEBUG_ENABLED
printf("\t--debug : dump a debug tree of the in-memory document\n");
+#endif
printf("\t--noout : do not print the result\n");
}
xmlSchemaCleanupTypes();
diff --git a/xpath.c b/xpath.c
index b176ed52..333d2000 100644
--- a/xpath.c
+++ b/xpath.c
@@ -2825,7 +2825,7 @@ xmlXPathRegisterNs(xmlXPathContextPtr ctxt, const xmlChar *prefix,
ctxt->nsHash = xmlHashCreate(10);
if (ctxt->nsHash == NULL)
return(-1);
- return(xmlHashUpdateEntry(ctxt->nsHash, prefix, (void *) ns_uri,
+ return(xmlHashUpdateEntry(ctxt->nsHash, prefix, (void *) xmlStrdup(ns_uri),
(xmlHashDeallocator)xmlFree));
}
@@ -2875,7 +2875,7 @@ xmlXPathRegisteredNsCleanup(xmlXPathContextPtr ctxt) {
if (ctxt == NULL)
return;
- xmlHashFree(ctxt->nsHash, NULL);
+ xmlHashFree(ctxt->nsHash, (xmlHashDeallocator)xmlFree);
ctxt->nsHash = NULL;
}
@@ -10773,6 +10773,119 @@ xmlXPathEvalExpression(const xmlChar *str, xmlXPathContextPtr ctxt) {
return(res);
}
+/************************************************************************
+ * *
+ * Extra functions not pertaining to the XPath spec *
+ * *
+ ************************************************************************/
+/**
+ * xmlXPathEscapeUriFunction:
+ * @ctxt: the XPath Parser context
+ * @nargs: the number of arguments
+ *
+ * Implement the escape-uri() XPath function
+ * string escape-uri(string $str, bool $escape-reserved)
+ *
+ * This function applies the URI escaping rules defined in section 2 of [RFC
+ * 2396] to the string supplied as $uri-part, which typically represents all
+ * or part of a URI. The effect of the function is to replace any special
+ * character in the string by an escape sequence of the form %xx%yy...,
+ * where xxyy... is the hexadecimal representation of the octets used to
+ * represent the character in UTF-8.
+ *
+ * The set of characters that are escaped depends on the setting of the
+ * boolean argument $escape-reserved.
+ *
+ * If $escape-reserved is true, all characters are escaped other than lower
+ * case letters a-z, upper case letters A-Z, digits 0-9, and the characters
+ * referred to in [RFC 2396] as "marks": specifically, "-" | "_" | "." | "!"
+ * | "~" | "*" | "'" | "(" | ")". The "%" character itself is escaped only
+ * if it is not followed by two hexadecimal digits (that is, 0-9, a-f, and
+ * A-F).
+ *
+ * If $escape-reserved is false, the behavior differs in that characters
+ * referred to in [RFC 2396] as reserved characters are not escaped. These
+ * characters are ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ",".
+ *
+ * [RFC 2396] does not define whether escaped URIs should use lower case or
+ * upper case for hexadecimal digits. To ensure that escaped URIs can be
+ * compared using string comparison functions, this function must always use
+ * the upper-case letters A-F.
+ *
+ * Generally, $escape-reserved should be set to true when escaping a string
+ * that is to form a single part of a URI, and to false when escaping an
+ * entire URI or URI reference.
+ *
+ * In the case of non-ascii characters, the string is encoded according to
+ * utf-8 and then converted according to RFC 2396.
+ *
+ * Examples
+ * xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), true())
+ * returns "gopher%3A%2F%2Fspinaltap.micro.umn.edu%2F00%2FWeather%2FCalifornia%2FLos%20Angeles%23ocean"
+ * xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), false())
+ * returns "gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles%23ocean"
+ *
+ */
+void
+xmlXPathEscapeUriFunction(xmlXPathParserContextPtr ctxt, int nargs) {
+ xmlXPathObjectPtr str;
+ int escape_reserved;
+ xmlBufferPtr target;
+ xmlChar *cptr;
+ xmlChar escape[4];
+
+ CHECK_ARITY(2);
+
+ escape_reserved = xmlXPathPopBoolean(ctxt);
+
+ CAST_TO_STRING;
+ str = valuePop(ctxt);
+
+ target = xmlBufferCreate();
+
+ escape[0] = '%';
+ escape[3] = 0;
+
+ if (target) {
+ for (cptr = str->stringval; *cptr; cptr++) {
+ if ((*cptr >= 'A' && *cptr <= 'Z') ||
+ (*cptr >= 'a' && *cptr <= 'z') ||
+ (*cptr >= '0' && *cptr <= '9') ||
+ *cptr == '-' || *cptr == '_' || *cptr == '.' ||
+ *cptr == '!' || *cptr == '~' || *cptr == '*' ||
+ *cptr == '\''|| *cptr == '(' || *cptr == ')' ||
+ (*cptr == '%' &&
+ ((cptr[1] >= 'A' && cptr[1] <= 'F') ||
+ (cptr[1] >= 'a' && cptr[1] <= 'f') ||
+ (cptr[1] >= '0' && cptr[1] <= '9')) &&
+ ((cptr[2] >= 'A' && cptr[2] <= 'F') ||
+ (cptr[2] >= 'a' && cptr[2] <= 'f') ||
+ (cptr[2] >= '0' && cptr[2] <= '9'))) ||
+ (!escape_reserved &&
+ (*cptr == ';' || *cptr == '/' || *cptr == '?' ||
+ *cptr == ':' || *cptr == '@' || *cptr == '&' ||
+ *cptr == '=' || *cptr == '+' || *cptr == '$' ||
+ *cptr == ','))) {
+ xmlBufferAdd(target, cptr, 1);
+ } else {
+ if ((*cptr >> 4) < 10)
+ escape[1] = '0' + (*cptr >> 4);
+ else
+ escape[1] = 'A' - 10 + (*cptr >> 4);
+ if ((*cptr & 0xF) < 10)
+ escape[2] = '0' + (*cptr & 0xF);
+ else
+ escape[2] = 'A' - 10 + (*cptr & 0xF);
+
+ xmlBufferAdd(target, &escape[0], 3);
+ }
+ }
+ }
+ valuePush(ctxt, xmlXPathNewString(xmlBufferContent(target)));
+ xmlBufferFree(target);
+ xmlXPathFreeObject(str);
+}
+
/**
* xmlXPathRegisterAllFunctions:
* @ctxt: the XPath context
@@ -10836,6 +10949,10 @@ xmlXPathRegisterAllFunctions(xmlXPathContextPtr ctxt)
xmlXPathTrueFunction);
xmlXPathRegisterFunc(ctxt, (const xmlChar *)"translate",
xmlXPathTranslateFunction);
+
+ xmlXPathRegisterFuncNS(ctxt, (const xmlChar *)"escape-uri",
+ (const xmlChar *)"http://www.w3.org/2002/08/xquery-functions",
+ xmlXPathEscapeUriFunction);
}
#endif /* LIBXML_XPATH_ENABLED */
|