Index: third_party/libxslt/libxslt/numbers.c |
diff --git a/third_party/libxslt/libxslt/numbers.c b/third_party/libxslt/libxslt/numbers.c |
index 9cd1cf30591fe7ccec0e6f28c39487a06fdad1d8..184ee6f5ccd086b3a19715c134df0c67bd0033fd 100644 |
--- a/third_party/libxslt/libxslt/numbers.c |
+++ b/third_party/libxslt/libxslt/numbers.c |
@@ -532,13 +532,48 @@ xsltNumberFormatInsertNumbers(xsltNumberDataPtr data, |
} |
static int |
+xsltTestCompMatchCount(xsltTransformContextPtr context, |
+ xmlNodePtr node, |
+ xsltCompMatchPtr countPat, |
+ xmlNodePtr cur) |
+{ |
+ if (countPat != NULL) { |
+ return xsltTestCompMatchList(context, node, countPat); |
+ } |
+ else { |
+ /* |
+ * 7.7 Numbering |
+ * |
+ * If count attribute is not specified, then it defaults to the |
+ * pattern that matches any node with the same node type as the |
+ * current node and, if the current node has an expanded-name, with |
+ * the same expanded-name as the current node. |
+ */ |
+ if (node->type != cur->type) |
+ return 0; |
+ if (node->type == XML_NAMESPACE_DECL) |
+ /* |
+ * Namespace nodes have no preceding siblings and no parents |
+ * that are namespace nodes. This means that node == cur. |
+ */ |
+ return 1; |
+ /* TODO: Skip node types without expanded names like text nodes. */ |
+ if (!xmlStrEqual(node->name, cur->name)) |
+ return 0; |
+ if (node->ns == cur->ns) |
+ return 1; |
+ if ((node->ns == NULL) || (cur->ns == NULL)) |
+ return 0; |
+ return (xmlStrEqual(node->ns->href, cur->ns->href)); |
+ } |
+} |
+ |
+static int |
xsltNumberFormatGetAnyLevel(xsltTransformContextPtr context, |
xmlNodePtr node, |
xsltCompMatchPtr countPat, |
xsltCompMatchPtr fromPat, |
- double *array, |
- xmlDocPtr doc, |
- xmlNodePtr elem) |
+ double *array) |
{ |
int amount = 0; |
int cnt = 0; |
@@ -564,21 +599,8 @@ xsltNumberFormatGetAnyLevel(xsltTransformContextPtr context, |
while (cur != NULL) { |
/* process current node */ |
- if (countPat == NULL) { |
- if ((node->type == cur->type) && |
- /* FIXME: must use expanded-name instead of local name */ |
- xmlStrEqual(node->name, cur->name)) { |
- if ((node->ns == cur->ns) || |
- ((node->ns != NULL) && |
- (cur->ns != NULL) && |
- (xmlStrEqual(node->ns->href, |
- cur->ns->href) ))) |
- cnt++; |
- } |
- } else { |
- if (xsltTestCompMatchList(context, cur, countPat)) |
- cnt++; |
- } |
+ if (xsltTestCompMatchCount(context, cur, countPat, node)) |
+ cnt++; |
if ((fromPat != NULL) && |
xsltTestCompMatchList(context, cur, fromPat)) { |
break; /* while */ |
@@ -615,9 +637,7 @@ xsltNumberFormatGetMultipleLevel(xsltTransformContextPtr context, |
xsltCompMatchPtr countPat, |
xsltCompMatchPtr fromPat, |
double *array, |
- int max, |
- xmlDocPtr doc, |
- xmlNodePtr elem) |
+ int max) |
{ |
int amount = 0; |
int cnt; |
@@ -637,30 +657,18 @@ xsltNumberFormatGetMultipleLevel(xsltTransformContextPtr context, |
xsltTestCompMatchList(context, ancestor, fromPat)) |
break; /* for */ |
- if ((countPat == NULL && node->type == ancestor->type && |
- xmlStrEqual(node->name, ancestor->name)) || |
- xsltTestCompMatchList(context, ancestor, countPat)) { |
+ if (xsltTestCompMatchCount(context, ancestor, countPat, node)) { |
/* count(preceding-sibling::*) */ |
- cnt = 0; |
- for (preceding = ancestor; |
+ cnt = 1; |
+ for (preceding = |
+ xmlXPathNextPrecedingSibling(parser, ancestor); |
preceding != NULL; |
preceding = |
xmlXPathNextPrecedingSibling(parser, preceding)) { |
- if (countPat == NULL) { |
- if ((preceding->type == ancestor->type) && |
- xmlStrEqual(preceding->name, ancestor->name)){ |
- if ((preceding->ns == ancestor->ns) || |
- ((preceding->ns != NULL) && |
- (ancestor->ns != NULL) && |
- (xmlStrEqual(preceding->ns->href, |
- ancestor->ns->href) ))) |
- cnt++; |
- } |
- } else { |
- if (xsltTestCompMatchList(context, preceding, |
- countPat)) |
- cnt++; |
- } |
+ |
+ if (xsltTestCompMatchCount(context, preceding, countPat, |
+ node)) |
+ cnt++; |
} |
array[amount++] = (double)cnt; |
if (amount >= max) |
@@ -717,24 +725,29 @@ xsltNumberFormat(xsltTransformContextPtr ctxt, |
int amount, i; |
double number; |
xsltFormat tokens; |
- int tempformat = 0; |
- if ((data->format == NULL) && (data->has_format != 0)) { |
- data->format = xsltEvalAttrValueTemplate(ctxt, data->node, |
+ if (data->format != NULL) { |
+ xsltNumberFormatTokenize(data->format, &tokens); |
+ } |
+ else { |
+ xmlChar *format; |
+ |
+ /* The format needs to be recomputed each time */ |
+ if (data->has_format == 0) |
+ return; |
+ format = xsltEvalAttrValueTemplate(ctxt, data->node, |
(const xmlChar *) "format", |
XSLT_NAMESPACE); |
- tempformat = 1; |
- } |
- if (data->format == NULL) { |
- return; |
+ if (format == NULL) |
+ return; |
+ xsltNumberFormatTokenize(format, &tokens); |
+ xmlFree(format); |
} |
output = xmlBufferCreate(); |
if (output == NULL) |
goto XSLT_NUMBER_FORMAT_END; |
- xsltNumberFormatTokenize(data->format, &tokens); |
- |
/* |
* Evaluate the XPath expression to find the value(s) |
*/ |
@@ -759,9 +772,7 @@ xsltNumberFormat(xsltTransformContextPtr ctxt, |
data->countPat, |
data->fromPat, |
&number, |
- 1, |
- data->doc, |
- data->node); |
+ 1); |
if (amount == 1) { |
xsltNumberFormatInsertNumbers(data, |
&number, |
@@ -777,9 +788,7 @@ xsltNumberFormat(xsltTransformContextPtr ctxt, |
data->countPat, |
data->fromPat, |
numarray, |
- max, |
- data->doc, |
- data->node); |
+ max); |
if (amount > 0) { |
xsltNumberFormatInsertNumbers(data, |
numarray, |
@@ -792,9 +801,7 @@ xsltNumberFormat(xsltTransformContextPtr ctxt, |
node, |
data->countPat, |
data->fromPat, |
- &number, |
- data->doc, |
- data->node); |
+ &number); |
if (amount > 0) { |
xsltNumberFormatInsertNumbers(data, |
&number, |
@@ -807,6 +814,9 @@ xsltNumberFormat(xsltTransformContextPtr ctxt, |
/* Insert number as text node */ |
xsltCopyTextString(ctxt, ctxt->insert, xmlBufferContent(output), 0); |
+ xmlBufferFree(output); |
+ |
+XSLT_NUMBER_FORMAT_END: |
if (tokens.start != NULL) |
xmlFree(tokens.start); |
if (tokens.end != NULL) |
@@ -815,14 +825,6 @@ xsltNumberFormat(xsltTransformContextPtr ctxt, |
if (tokens.tokens[i].separator != NULL) |
xmlFree(tokens.tokens[i].separator); |
} |
- |
-XSLT_NUMBER_FORMAT_END: |
- if (tempformat == 1) { |
- /* The format need to be recomputed each time */ |
- data->format = NULL; |
- } |
- if (output != NULL) |
- xmlBufferFree(output); |
} |
static int |