Index: third_party/libxslt/libxslt/numbers.c |
diff --git a/third_party/libxslt/libxslt/numbers.c b/third_party/libxslt/libxslt/numbers.c |
index 3b932a59ba55d0e744caf2327017e10aec95327b..e78c46b6357b7bc5f0cc4c523a6e359f8f86460b 100644 |
--- a/third_party/libxslt/libxslt/numbers.c |
+++ b/third_party/libxslt/libxslt/numbers.c |
@@ -616,25 +616,7 @@ xsltNumberFormatGetAnyLevel(xsltTransformContextPtr context, |
{ |
int amount = 0; |
int cnt = 0; |
- xmlNodePtr cur; |
- |
- /* select the starting node */ |
- switch (node->type) { |
- case XML_ELEMENT_NODE: |
- cur = node; |
- break; |
- case XML_ATTRIBUTE_NODE: |
- cur = ((xmlAttrPtr) node)->parent; |
- break; |
- case XML_TEXT_NODE: |
- case XML_PI_NODE: |
- case XML_COMMENT_NODE: |
- cur = node->parent; |
- break; |
- default: |
- cur = NULL; |
- break; |
- } |
+ xmlNodePtr cur = node; |
while (cur != NULL) { |
/* process current node */ |
@@ -653,16 +635,25 @@ xsltNumberFormatGetAnyLevel(xsltTransformContextPtr context, |
(cur->type == XML_HTML_DOCUMENT_NODE)) |
break; /* while */ |
- while ((cur->prev != NULL) && ((cur->prev->type == XML_DTD_NODE) || |
- (cur->prev->type == XML_XINCLUDE_START) || |
- (cur->prev->type == XML_XINCLUDE_END))) |
- cur = cur->prev; |
- if (cur->prev != NULL) { |
- for (cur = cur->prev; cur->last != NULL; cur = cur->last); |
- } else { |
- cur = cur->parent; |
- } |
- |
+ if (cur->type == XML_NAMESPACE_DECL) { |
+ /* |
+ * The XPath module stores the parent of a namespace node in |
+ * the ns->next field. |
+ */ |
+ cur = (xmlNodePtr) ((xmlNsPtr) cur)->next; |
+ } else if (cur->type == XML_ATTRIBUTE_NODE) { |
+ cur = cur->parent; |
+ } else { |
+ while ((cur->prev != NULL) && ((cur->prev->type == XML_DTD_NODE) || |
+ (cur->prev->type == XML_XINCLUDE_START) || |
+ (cur->prev->type == XML_XINCLUDE_END))) |
+ cur = cur->prev; |
+ if (cur->prev != NULL) { |
+ for (cur = cur->prev; cur->last != NULL; cur = cur->last); |
+ } else { |
+ cur = cur->parent; |
+ } |
+ } |
} |
array[amount++] = (double) cnt; |