OLD | NEW |
1 /* | 1 /* |
2 * xinclude.c : Code to implement XInclude processing | 2 * xinclude.c : Code to implement XInclude processing |
3 * | 3 * |
4 * World Wide Web Consortium W3C Last Call Working Draft 10 November 2003 | 4 * World Wide Web Consortium W3C Last Call Working Draft 10 November 2003 |
5 * http://www.w3.org/TR/2003/WD-xinclude-20031110 | 5 * http://www.w3.org/TR/2003/WD-xinclude-20031110 |
6 * | 6 * |
7 * See Copyright for the status of this software. | 7 * See Copyright for the status of this software. |
8 * | 8 * |
9 * daniel@veillard.com | 9 * daniel@veillard.com |
10 */ | 10 */ |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 | 431 |
432 /* | 432 /* |
433 * pass in the application data to the parser context. | 433 * pass in the application data to the parser context. |
434 */ | 434 */ |
435 pctxt->_private = ctxt->_private; | 435 pctxt->_private = ctxt->_private; |
436 | 436 |
437 /* | 437 /* |
438 * try to ensure that new documents included are actually | 438 * try to ensure that new documents included are actually |
439 * built with the same dictionary as the including document. | 439 * built with the same dictionary as the including document. |
440 */ | 440 */ |
441 if ((ctxt->doc != NULL) && (ctxt->doc->dict != NULL) && | 441 if ((ctxt->doc != NULL) && (ctxt->doc->dict != NULL)) { |
442 (pctxt->dict != NULL)) { | 442 if (pctxt->dict != NULL) |
443 » xmlDictFree(pctxt->dict); | 443 xmlDictFree(pctxt->dict); |
444 pctxt->dict = ctxt->doc->dict; | 444 pctxt->dict = ctxt->doc->dict; |
445 xmlDictReference(pctxt->dict); | 445 xmlDictReference(pctxt->dict); |
446 } | 446 } |
447 | 447 |
448 xmlCtxtUseOptions(pctxt, ctxt->parseFlags | XML_PARSE_DTDLOAD); | 448 xmlCtxtUseOptions(pctxt, ctxt->parseFlags | XML_PARSE_DTDLOAD); |
449 | 449 |
450 inputStream = xmlLoadExternalEntity(URL, NULL, pctxt); | 450 inputStream = xmlLoadExternalEntity(URL, NULL, pctxt); |
451 if (inputStream == NULL) { | 451 if (inputStream == NULL) { |
452 xmlFreeParserCtxt(pctxt); | 452 xmlFreeParserCtxt(pctxt); |
453 return(NULL); | 453 return(NULL); |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 ctxt->txturlTab[ctxt->txtNr] = xmlStrdup(url); | 791 ctxt->txturlTab[ctxt->txtNr] = xmlStrdup(url); |
792 ctxt->txtNr++; | 792 ctxt->txtNr++; |
793 } | 793 } |
794 | 794 |
795 /************************************************************************ | 795 /************************************************************************ |
796 * * | 796 * * |
797 * Node copy with specific semantic * | 797 * Node copy with specific semantic * |
798 * * | 798 * * |
799 ************************************************************************/ | 799 ************************************************************************/ |
800 | 800 |
| 801 static xmlNodePtr |
| 802 xmlXIncludeCopyNodeList(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, |
| 803 xmlDocPtr source, xmlNodePtr elem); |
| 804 |
801 /** | 805 /** |
802 * xmlXIncludeCopyNode: | 806 * xmlXIncludeCopyNode: |
803 * @ctxt: the XInclude context | 807 * @ctxt: the XInclude context |
804 * @target: the document target | 808 * @target: the document target |
805 * @source: the document source | 809 * @source: the document source |
806 * @elem: the element | 810 * @elem: the element |
807 * | 811 * |
808 * Make a copy of the node while preserving the XInclude semantic | 812 * Make a copy of the node while preserving the XInclude semantic |
809 * of the Infoset copy | 813 * of the Infoset copy |
810 */ | 814 */ |
811 static xmlNodePtr | 815 static xmlNodePtr |
812 xmlXIncludeCopyNode(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, | 816 xmlXIncludeCopyNode(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, |
813 xmlDocPtr source, xmlNodePtr elem) { | 817 xmlDocPtr source, xmlNodePtr elem) { |
814 xmlNodePtr result = NULL; | 818 xmlNodePtr result = NULL; |
815 | 819 |
816 if ((ctxt == NULL) || (target == NULL) || (source == NULL) || | 820 if ((ctxt == NULL) || (target == NULL) || (source == NULL) || |
817 (elem == NULL)) | 821 (elem == NULL)) |
818 return(NULL); | 822 return(NULL); |
819 if (elem->type == XML_DTD_NODE) | 823 if (elem->type == XML_DTD_NODE) |
820 return(NULL); | 824 return(NULL); |
821 result = xmlDocCopyNode(elem, target, 1); | 825 if (elem->type == XML_DOCUMENT_NODE) |
| 826 » result = xmlXIncludeCopyNodeList(ctxt, target, source, elem->children); |
| 827 else |
| 828 result = xmlDocCopyNode(elem, target, 1); |
822 return(result); | 829 return(result); |
823 } | 830 } |
824 | 831 |
825 /** | 832 /** |
826 * xmlXIncludeCopyNodeList: | 833 * xmlXIncludeCopyNodeList: |
827 * @ctxt: the XInclude context | 834 * @ctxt: the XInclude context |
828 * @target: the document target | 835 * @target: the document target |
829 * @source: the document source | 836 * @source: the document source |
830 * @elem: the element list | 837 * @elem: the element list |
831 * | 838 * |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
960 const xmlChar *content = cur->content; | 967 const xmlChar *content = cur->content; |
961 int len; | 968 int len; |
962 | 969 |
963 if (content == NULL) { | 970 if (content == NULL) { |
964 tmp = xmlNewTextLen(NULL, 0); | 971 tmp = xmlNewTextLen(NULL, 0); |
965 } else { | 972 } else { |
966 len = index2; | 973 len = index2; |
967 if ((cur == start) && (index1 > 1)) { | 974 if ((cur == start) && (index1 > 1)) { |
968 content += (index1 - 1); | 975 content += (index1 - 1); |
969 len -= (index1 - 1); | 976 len -= (index1 - 1); |
970 index1 = 0; | |
971 } else { | 977 } else { |
972 len = index2; | 978 len = index2; |
973 } | 979 } |
974 tmp = xmlNewTextLen(content, len); | 980 tmp = xmlNewTextLen(content, len); |
975 } | 981 } |
976 /* single sub text node selection */ | 982 /* single sub text node selection */ |
977 if (list == NULL) | 983 if (list == NULL) |
978 return(tmp); | 984 return(tmp); |
979 /* prune and return full set */ | 985 /* prune and return full set */ |
980 if (level == lastLevel) | 986 if (level == lastLevel) |
(...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1671 xmlXPathFreeObject(xptr); | 1677 xmlXPathFreeObject(xptr); |
1672 } | 1678 } |
1673 xmlXPathFreeContext(xptrctxt); | 1679 xmlXPathFreeContext(xptrctxt); |
1674 xmlFree(fragment); | 1680 xmlFree(fragment); |
1675 } | 1681 } |
1676 #endif | 1682 #endif |
1677 | 1683 |
1678 /* | 1684 /* |
1679 * Do the xml:base fixup if needed | 1685 * Do the xml:base fixup if needed |
1680 */ | 1686 */ |
1681 if ((doc != NULL) && (URL != NULL) && (xmlStrchr(URL, (xmlChar) '/'))) { | 1687 if ((doc != NULL) && (URL != NULL) && (xmlStrchr(URL, (xmlChar) '/')) && |
| 1688 (!(ctxt->parseFlags & XML_PARSE_NOBASEFIX)) && |
| 1689 » (!(doc->parseFlags & XML_PARSE_NOBASEFIX))) { |
1682 xmlNodePtr node; | 1690 xmlNodePtr node; |
1683 xmlChar *base; | 1691 xmlChar *base; |
1684 xmlChar *curBase; | 1692 xmlChar *curBase; |
1685 | 1693 |
1686 /* | 1694 /* |
1687 * The base is only adjusted if "necessary", i.e. if the xinclude node | 1695 * The base is only adjusted if "necessary", i.e. if the xinclude node |
1688 * has a base specified, or the URL is relative | 1696 * has a base specified, or the URL is relative |
1689 */ | 1697 */ |
1690 base = xmlGetNsProp(ctxt->incTab[nr]->ref, BAD_CAST "base", | 1698 base = xmlGetNsProp(ctxt->incTab[nr]->ref, BAD_CAST "base", |
1691 XML_XML_NAMESPACE); | 1699 XML_XML_NAMESPACE); |
(...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2414 * | 2422 * |
2415 * Returns 0 in case of success and -1 in case of error. | 2423 * Returns 0 in case of success and -1 in case of error. |
2416 */ | 2424 */ |
2417 int | 2425 int |
2418 xmlXIncludeSetFlags(xmlXIncludeCtxtPtr ctxt, int flags) { | 2426 xmlXIncludeSetFlags(xmlXIncludeCtxtPtr ctxt, int flags) { |
2419 if (ctxt == NULL) | 2427 if (ctxt == NULL) |
2420 return(-1); | 2428 return(-1); |
2421 ctxt->parseFlags = flags; | 2429 ctxt->parseFlags = flags; |
2422 return(0); | 2430 return(0); |
2423 } | 2431 } |
2424 | 2432 |
| 2433 /** |
| 2434 * xmlXIncludeProcessTreeFlagsData: |
| 2435 * @tree: an XML node |
| 2436 * @flags: a set of xmlParserOption used for parsing XML includes |
| 2437 * @data: application data that will be passed to the parser context |
| 2438 * in the _private field of the parser context(s) |
| 2439 * |
| 2440 * Implement the XInclude substitution on the XML node @tree |
| 2441 * |
| 2442 * Returns 0 if no substitution were done, -1 if some processing failed |
| 2443 * or the number of substitutions done. |
| 2444 */ |
| 2445 |
| 2446 int |
| 2447 xmlXIncludeProcessTreeFlagsData(xmlNodePtr tree, int flags, void *data) { |
| 2448 xmlXIncludeCtxtPtr ctxt; |
| 2449 int ret = 0; |
| 2450 |
| 2451 if ((tree == NULL) || (tree->doc == NULL)) |
| 2452 return(-1); |
| 2453 |
| 2454 ctxt = xmlXIncludeNewContext(tree->doc); |
| 2455 if (ctxt == NULL) |
| 2456 return(-1); |
| 2457 ctxt->_private = data; |
| 2458 ctxt->base = xmlStrdup((xmlChar *)tree->doc->URL); |
| 2459 xmlXIncludeSetFlags(ctxt, flags); |
| 2460 ret = xmlXIncludeDoProcess(ctxt, tree->doc, tree); |
| 2461 if ((ret >= 0) && (ctxt->nbErrors > 0)) |
| 2462 ret = -1; |
| 2463 |
| 2464 xmlXIncludeFreeContext(ctxt); |
| 2465 return(ret); |
| 2466 } |
| 2467 |
2425 /** | 2468 /** |
2426 * xmlXIncludeProcessFlagsData: | 2469 * xmlXIncludeProcessFlagsData: |
2427 * @doc: an XML document | 2470 * @doc: an XML document |
2428 * @flags: a set of xmlParserOption used for parsing XML includes | 2471 * @flags: a set of xmlParserOption used for parsing XML includes |
2429 * @data: application data that will be passed to the parser context | 2472 * @data: application data that will be passed to the parser context |
2430 * in the _private field of the parser context(s) | 2473 * in the _private field of the parser context(s) |
2431 * | 2474 * |
2432 * Implement the XInclude substitution on the XML document @doc | 2475 * Implement the XInclude substitution on the XML document @doc |
2433 * | 2476 * |
2434 * Returns 0 if no substitution were done, -1 if some processing failed | 2477 * Returns 0 if no substitution were done, -1 if some processing failed |
2435 * or the number of substitutions done. | 2478 * or the number of substitutions done. |
2436 */ | 2479 */ |
2437 int | 2480 int |
2438 xmlXIncludeProcessFlagsData(xmlDocPtr doc, int flags, void *data) { | 2481 xmlXIncludeProcessFlagsData(xmlDocPtr doc, int flags, void *data) { |
2439 xmlXIncludeCtxtPtr ctxt; | |
2440 xmlNodePtr tree; | 2482 xmlNodePtr tree; |
2441 int ret = 0; | |
2442 | 2483 |
2443 if (doc == NULL) | 2484 if (doc == NULL) |
2444 return(-1); | 2485 return(-1); |
2445 tree = xmlDocGetRootElement(doc); | 2486 tree = xmlDocGetRootElement(doc); |
2446 if (tree == NULL) | 2487 if (tree == NULL) |
2447 return(-1); | 2488 return(-1); |
2448 ctxt = xmlXIncludeNewContext(doc); | 2489 return(xmlXIncludeProcessTreeFlagsData(tree, flags, data)); |
2449 if (ctxt == NULL) | |
2450 » return(-1); | |
2451 ctxt->_private = data; | |
2452 ctxt->base = xmlStrdup((xmlChar *)doc->URL); | |
2453 xmlXIncludeSetFlags(ctxt, flags); | |
2454 ret = xmlXIncludeDoProcess(ctxt, doc, tree); | |
2455 if ((ret >= 0) && (ctxt->nbErrors > 0)) | |
2456 » ret = -1; | |
2457 | |
2458 xmlXIncludeFreeContext(ctxt); | |
2459 return(ret); | |
2460 } | 2490 } |
2461 | 2491 |
2462 /** | 2492 /** |
2463 * xmlXIncludeProcessFlags: | 2493 * xmlXIncludeProcessFlags: |
2464 * @doc: an XML document | 2494 * @doc: an XML document |
2465 * @flags: a set of xmlParserOption used for parsing XML includes | 2495 * @flags: a set of xmlParserOption used for parsing XML includes |
2466 * | 2496 * |
2467 * Implement the XInclude substitution on the XML document @doc | 2497 * Implement the XInclude substitution on the XML document @doc |
2468 * | 2498 * |
2469 * Returns 0 if no substitution were done, -1 if some processing failed | 2499 * Returns 0 if no substitution were done, -1 if some processing failed |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2552 ret = xmlXIncludeDoProcess(ctxt, node->doc, node); | 2582 ret = xmlXIncludeDoProcess(ctxt, node->doc, node); |
2553 if ((ret >= 0) && (ctxt->nbErrors > 0)) | 2583 if ((ret >= 0) && (ctxt->nbErrors > 0)) |
2554 ret = -1; | 2584 ret = -1; |
2555 return(ret); | 2585 return(ret); |
2556 } | 2586 } |
2557 | 2587 |
2558 #else /* !LIBXML_XINCLUDE_ENABLED */ | 2588 #else /* !LIBXML_XINCLUDE_ENABLED */ |
2559 #endif | 2589 #endif |
2560 #define bottom_xinclude | 2590 #define bottom_xinclude |
2561 #include "elfgcchack.h" | 2591 #include "elfgcchack.h" |
OLD | NEW |