xref: /Universal-ctags/parsers/xslt.c (revision cbabd2be65f08cf776f1bc4c0a4f16fdf7bc9d39)
123765793SMasatake YAMATO /*
223765793SMasatake YAMATO *
323765793SMasatake YAMATO *   Copyright (c) 2016, Masatake YAMATO
423765793SMasatake YAMATO *   Copyright (c) 2016, Red Hat, K.K.
523765793SMasatake YAMATO *
623765793SMasatake YAMATO *   This source code is released for free distribution under the terms of the
723765793SMasatake YAMATO *   GNU General Public License version 2 or (at your option) any later version.
823765793SMasatake YAMATO *
923765793SMasatake YAMATO *   This module contains functions for generating tags for xslt 1.0.
1023765793SMasatake YAMATO *   Reference: https://www.w3.org/1999/11/xslt10.dtd
1123765793SMasatake YAMATO *
1223765793SMasatake YAMATO */
1323765793SMasatake YAMATO 
1423765793SMasatake YAMATO #include "general.h"	/* must always come first */
1523765793SMasatake YAMATO 
1623765793SMasatake YAMATO #include <string.h>
1723765793SMasatake YAMATO 
1814781660SMasatake YAMATO #include "entry.h"
1923765793SMasatake YAMATO #include "options.h"
2023765793SMasatake YAMATO #include "parse.h"
2123765793SMasatake YAMATO #include "read.h"
2223765793SMasatake YAMATO #include "routines.h"
2323765793SMasatake YAMATO #include "selectors.h"
24f681f9a9SMasatake YAMATO #include "xml.h"
2523765793SMasatake YAMATO 
2623765793SMasatake YAMATO typedef enum {
2723765793SMasatake YAMATO 	K_STYLESHEET,
2823765793SMasatake YAMATO 	K_PARAMETER,
2923765793SMasatake YAMATO 	K_MATCHED_TEMPLATE,
3023765793SMasatake YAMATO 	K_NAMED_TEMPLATE,
3123765793SMasatake YAMATO 	K_VARIABLE,
3223765793SMasatake YAMATO 	/* TODO: KEY, DECIMAL-FORMAT, ATTRIBUTE, ATTRIBUTE-SET, ... */
3323765793SMasatake YAMATO } xsltKind;
3423765793SMasatake YAMATO 
3523765793SMasatake YAMATO typedef enum {
3623765793SMasatake YAMATO 	R_STYLESHEET_IMPORTED,
3723765793SMasatake YAMATO 	R_STYLESHEET_INCLUDED,
3823765793SMasatake YAMATO } xsltStylesheetRole;
3913457258SMasatake YAMATO static roleDefinition XsltStylesheetRoles [] = {
40ce990805SThomas Braun 	{ true, "imported", "imported" },
41ce990805SThomas Braun 	{ true, "included", "included" },
4223765793SMasatake YAMATO };
4323765793SMasatake YAMATO 
4423765793SMasatake YAMATO typedef enum {
4523765793SMasatake YAMATO 	R_PARAMETER_BOUND,
4623765793SMasatake YAMATO } xsltParameterRole;
4713457258SMasatake YAMATO static roleDefinition XsltParameterRoles [] = {
48ce990805SThomas Braun 	{ true, "bound", "bound to value" },
4923765793SMasatake YAMATO };
5023765793SMasatake YAMATO 
5123765793SMasatake YAMATO typedef enum {
5223765793SMasatake YAMATO 	R_MATCHED_TEMPLATE_APPLIED,
5323765793SMasatake YAMATO } xsltMatchedTemplateRole;
5413457258SMasatake YAMATO static roleDefinition XsltMatchedTemplateRoles [] = {
55ce990805SThomas Braun 	{ true, "applied", "applied" },
5623765793SMasatake YAMATO };
5723765793SMasatake YAMATO 
5823765793SMasatake YAMATO typedef enum {
5923765793SMasatake YAMATO 	R_NAMED_TEMPLATE_CALLED,
6023765793SMasatake YAMATO } xsltNamedTemplateRole;
6113457258SMasatake YAMATO static roleDefinition XsltNamedTemplateRoles [] = {
62ce990805SThomas Braun 	{ true, "called", "called" },
6323765793SMasatake YAMATO };
6423765793SMasatake YAMATO 
6523765793SMasatake YAMATO 
66e112e8abSMasatake YAMATO static kindDefinition XsltKinds [] = {
67ce990805SThomas Braun 	{ true,  's', "stylesheet", "stylesheets",
68ce990805SThomas Braun 	  .referenceOnly = true, ATTACH_ROLES (XsltStylesheetRoles) },
69ce990805SThomas Braun 	{ true,  'p', "parameter", "parameters",
70ce990805SThomas Braun 	  .referenceOnly = false, ATTACH_ROLES (XsltParameterRoles) },
71ce990805SThomas Braun 	{ true,  'm', "matchedTemplate", "matched template",
72ce990805SThomas Braun 	  .referenceOnly = false, ATTACH_ROLES (XsltMatchedTemplateRoles) },
73*cbabd2beSMasatake YAMATO 	{ true,  'n', "namedTemplate",   "named template",
74ce990805SThomas Braun 	  .referenceOnly = false, ATTACH_ROLES (XsltNamedTemplateRoles) },
75ce990805SThomas Braun 	{ true,  'v', "variable", "variables" },
7623765793SMasatake YAMATO };
7723765793SMasatake YAMATO 
7823765793SMasatake YAMATO static void makeTagRecursivelyWithVersionVerification (xmlNode *node,
79513a7223SMasatake YAMATO 						       const char *xpath,
8023765793SMasatake YAMATO 						       const tagXpathRecurSpec *spec,
8123765793SMasatake YAMATO 						       xmlXPathContext *ctx,
8223765793SMasatake YAMATO 						       void *userData);
8323765793SMasatake YAMATO static void makeTagRecursively (xmlNode *node,
84513a7223SMasatake YAMATO 				const char *xpath,
8523765793SMasatake YAMATO 				const tagXpathRecurSpec *spec,
8623765793SMasatake YAMATO 				xmlXPathContext *ctx,
8723765793SMasatake YAMATO 				void *userData);
8823765793SMasatake YAMATO 
8923765793SMasatake YAMATO static void makeTagWithProvidingScope (xmlNode *node,
90513a7223SMasatake YAMATO 				       const char *xpath,
9123765793SMasatake YAMATO 				       const tagXpathMakeTagSpec *spec,
9223765793SMasatake YAMATO 				       struct sTagEntryInfo *tag,
9323765793SMasatake YAMATO 				       void *userData);
9423765793SMasatake YAMATO 
9523765793SMasatake YAMATO enum xsltXpathTable {
9623765793SMasatake YAMATO 	TABLE_MAIN,
9723765793SMasatake YAMATO 	TABLE_STYLESHEET,
9823765793SMasatake YAMATO 	TABLE_VERSION_VERIFY,
9923765793SMasatake YAMATO 	TABLE_TEMPLATE,
10023765793SMasatake YAMATO 	TABLE_APPLIED_TEMPLATES,
10123765793SMasatake YAMATO 	TABLE_CALL_TEMPLATE,
10223765793SMasatake YAMATO 	TABLE_PARAM,
10323765793SMasatake YAMATO 	TABLE_VARIABLE,
10423765793SMasatake YAMATO 	TABLE_WITH_PARAM,
10523765793SMasatake YAMATO 	TABLE_CALL_TEMPLATE_INTERNAL,
10623765793SMasatake YAMATO };
10723765793SMasatake YAMATO 
10823765793SMasatake YAMATO #define xsltXpathTemplateTableEntry(PREFIX)				\
10923765793SMasatake YAMATO 	{ PREFIX "/*[local-name()='template']",				\
11023765793SMasatake YAMATO 	  LXPATH_TABLE_DO_RECUR,					\
11123765793SMasatake YAMATO 	  { .recurSpec = { makeTagRecursively, TABLE_TEMPLATE} }}
11223765793SMasatake YAMATO 
11323765793SMasatake YAMATO #define xsltXpathVariableTableEntry(PREFIX)				\
11423765793SMasatake YAMATO 	{ PREFIX "/*[local-name()='variable']",				\
11523765793SMasatake YAMATO 	  LXPATH_TABLE_DO_RECUR,					\
11623765793SMasatake YAMATO 	  { .recurSpec = { makeTagRecursively, TABLE_VARIABLE} }}
11723765793SMasatake YAMATO 
11823765793SMasatake YAMATO #define xsltXpathParamTableEntry(PREFIX)			\
11923765793SMasatake YAMATO 	{ PREFIX "/*[local-name()='param']",			\
12023765793SMasatake YAMATO 	  LXPATH_TABLE_DO_RECUR,				\
12123765793SMasatake YAMATO 	  { .recurSpec = { makeTagRecursively, TABLE_PARAM} }}
12223765793SMasatake YAMATO 
12323765793SMasatake YAMATO #define xsltXpathWithParamTableEntry(PREFIX)				\
12423765793SMasatake YAMATO 	{ PREFIX "/*[local-name()='with-param']",			\
12523765793SMasatake YAMATO 	  LXPATH_TABLE_DO_RECUR,					\
12623765793SMasatake YAMATO 	  { .recurSpec = { makeTagRecursively, TABLE_WITH_PARAM} }}	\
12723765793SMasatake YAMATO 
12823765793SMasatake YAMATO static tagXpathTable xsltXpathMainTable[] = {
12923765793SMasatake YAMATO 	{ "(/*[local-name()='stylesheet']|/*[local-name()='transform'])",
13023765793SMasatake YAMATO 	  LXPATH_TABLE_DO_RECUR,
13123765793SMasatake YAMATO 	  { .recurSpec = { makeTagRecursivelyWithVersionVerification } }},
13223765793SMasatake YAMATO };
13323765793SMasatake YAMATO 
13423765793SMasatake YAMATO static tagXpathTable xsltXpathStylesheetTable[] = {
13523765793SMasatake YAMATO 	{ "./*[local-name()='import']/@href",
13623765793SMasatake YAMATO 	  LXPATH_TABLE_DO_MAKE,
13723765793SMasatake YAMATO 	  { .makeTagSpec = {K_STYLESHEET, R_STYLESHEET_IMPORTED} }},
13823765793SMasatake YAMATO 	{ "./*[local-name()='include']/@href",
13923765793SMasatake YAMATO 	  LXPATH_TABLE_DO_MAKE,
14023765793SMasatake YAMATO 	  { .makeTagSpec = {K_STYLESHEET, R_STYLESHEET_INCLUDED} }},
14123765793SMasatake YAMATO 
14223765793SMasatake YAMATO 	xsltXpathTemplateTableEntry ("."),
14323765793SMasatake YAMATO 	xsltXpathVariableTableEntry ("."),
14423765793SMasatake YAMATO 	xsltXpathParamTableEntry    ("."),
14523765793SMasatake YAMATO };
14623765793SMasatake YAMATO 
14723765793SMasatake YAMATO static tagXpathTable xsltXpathTemplateTable[] = {
14823765793SMasatake YAMATO 	{ "./@match",
14923765793SMasatake YAMATO 	  LXPATH_TABLE_DO_MAKE,
15024b256e3SMasatake YAMATO 	  { .makeTagSpec = {K_MATCHED_TEMPLATE, ROLE_DEFINITION_INDEX,
15123765793SMasatake YAMATO 			    makeTagWithProvidingScope } }},
15223765793SMasatake YAMATO 	{ "./@name",
15323765793SMasatake YAMATO 	  LXPATH_TABLE_DO_MAKE,
15424b256e3SMasatake YAMATO 	  { .makeTagSpec = {K_NAMED_TEMPLATE, ROLE_DEFINITION_INDEX,
15523765793SMasatake YAMATO 			    makeTagWithProvidingScope } }},
15623765793SMasatake YAMATO 	{ ".",
15723765793SMasatake YAMATO 	  LXPATH_TABLE_DO_RECUR,
15823765793SMasatake YAMATO 	  { .recurSpec = { makeTagRecursively, TABLE_CALL_TEMPLATE_INTERNAL } }},
15923765793SMasatake YAMATO };
16023765793SMasatake YAMATO 
16123765793SMasatake YAMATO static tagXpathTable xsltXpathAppliedTemplatesTable [] = {
16223765793SMasatake YAMATO 	{ "./@select",
16323765793SMasatake YAMATO 	  LXPATH_TABLE_DO_MAKE,
16423765793SMasatake YAMATO 	  { .makeTagSpec = {K_MATCHED_TEMPLATE, R_MATCHED_TEMPLATE_APPLIED,
16523765793SMasatake YAMATO 			    makeTagWithProvidingScope } }},
16623765793SMasatake YAMATO 	xsltXpathWithParamTableEntry("."),
16723765793SMasatake YAMATO };
16823765793SMasatake YAMATO 
16923765793SMasatake YAMATO static tagXpathTable xsltXpathCallTemplateTable [] = {
17023765793SMasatake YAMATO 	{ "./@name",
17123765793SMasatake YAMATO 	  LXPATH_TABLE_DO_MAKE,
17223765793SMasatake YAMATO 	  { .makeTagSpec = {K_NAMED_TEMPLATE, R_NAMED_TEMPLATE_CALLED,
17323765793SMasatake YAMATO 			    makeTagWithProvidingScope } }},
17423765793SMasatake YAMATO 	xsltXpathWithParamTableEntry("."),
17523765793SMasatake YAMATO };
17623765793SMasatake YAMATO 
17723765793SMasatake YAMATO static tagXpathTable xsltXpathParamTable [] = {
17823765793SMasatake YAMATO 	{ "./@name",
17923765793SMasatake YAMATO 	  LXPATH_TABLE_DO_MAKE,
18024b256e3SMasatake YAMATO 	  { .makeTagSpec = {K_PARAMETER, ROLE_DEFINITION_INDEX,
18123765793SMasatake YAMATO 			    makeTagWithProvidingScope} }},
18223765793SMasatake YAMATO 	xsltXpathTemplateTableEntry ("."),
18323765793SMasatake YAMATO };
18423765793SMasatake YAMATO 
18523765793SMasatake YAMATO static tagXpathTable xsltXpathVariableTable [] = {
18623765793SMasatake YAMATO 	{ "./@name",
18723765793SMasatake YAMATO 	  LXPATH_TABLE_DO_MAKE,
18824b256e3SMasatake YAMATO 	  { .makeTagSpec = {K_VARIABLE, ROLE_DEFINITION_INDEX,
18923765793SMasatake YAMATO 			    makeTagWithProvidingScope} }},
19023765793SMasatake YAMATO 	xsltXpathTemplateTableEntry ("."),
19123765793SMasatake YAMATO };
19223765793SMasatake YAMATO 
19323765793SMasatake YAMATO static tagXpathTable xsltXpathWithParamTable [] = {
19423765793SMasatake YAMATO 	{ "./@name",
19523765793SMasatake YAMATO 	  LXPATH_TABLE_DO_MAKE,
19623765793SMasatake YAMATO 	  { .makeTagSpec = {K_PARAMETER, R_PARAMETER_BOUND,
19723765793SMasatake YAMATO 			    makeTagWithProvidingScope} }},
19823765793SMasatake YAMATO 	xsltXpathTemplateTableEntry ("."),
19923765793SMasatake YAMATO };
20023765793SMasatake YAMATO 
20123765793SMasatake YAMATO static tagXpathTable xsltXpathTemplateInternalTable [] = {
20223765793SMasatake YAMATO 	{ "./*[local-name()='apply-templates']",
20323765793SMasatake YAMATO 	  LXPATH_TABLE_DO_RECUR,
20423765793SMasatake YAMATO 	  { .recurSpec = { makeTagRecursively, TABLE_APPLIED_TEMPLATES } }},
20523765793SMasatake YAMATO 	{ "./*[local-name()='call-template']",
20623765793SMasatake YAMATO 	  LXPATH_TABLE_DO_RECUR,
20723765793SMasatake YAMATO 	  { .recurSpec = { makeTagRecursively, TABLE_CALL_TEMPLATE } }},
20823765793SMasatake YAMATO 	xsltXpathVariableTableEntry ("."),
20923765793SMasatake YAMATO 	xsltXpathParamTableEntry ("."),
21023765793SMasatake YAMATO 	{ "./node()[not ("
21123765793SMasatake YAMATO 	  "local-name()='apply-templates'"
21223765793SMasatake YAMATO 	  " or "
21323765793SMasatake YAMATO 	  "local-name()='call-template'"
21423765793SMasatake YAMATO 	  " or "
21523765793SMasatake YAMATO 	  "local-name()='variable'"
21623765793SMasatake YAMATO 	  " or "
21723765793SMasatake YAMATO 	  "local-name()='param'"
21823765793SMasatake YAMATO 	  ")]",
21923765793SMasatake YAMATO 	  LXPATH_TABLE_DO_RECUR,
22023765793SMasatake YAMATO 	  { .recurSpec = { makeTagRecursively, TABLE_CALL_TEMPLATE_INTERNAL } }},
22123765793SMasatake YAMATO };
22223765793SMasatake YAMATO 
verifyVersion(xmlNode * node,const char * xpath CTAGS_ATTR_UNUSED,const tagXpathRecurSpec * spec CTAGS_ATTR_UNUSED,xmlXPathContext * ctx CTAGS_ATTR_UNUSED,void * userData)22323765793SMasatake YAMATO static void verifyVersion (xmlNode *node,
224513a7223SMasatake YAMATO 			   const char *xpath CTAGS_ATTR_UNUSED,
225e4d16241SMasatake YAMATO 			   const tagXpathRecurSpec *spec CTAGS_ATTR_UNUSED,
226e4d16241SMasatake YAMATO 			   xmlXPathContext *ctx CTAGS_ATTR_UNUSED,
22723765793SMasatake YAMATO 			   void *userData)
22823765793SMasatake YAMATO {
229ce990805SThomas Braun 	bool *acceptable = userData;
23023765793SMasatake YAMATO 	char *version = (char *)xmlNodeGetContent (node);
23123765793SMasatake YAMATO 
23223765793SMasatake YAMATO 	if (version)
23323765793SMasatake YAMATO 	{
23423765793SMasatake YAMATO 		if (strcmp (version, "1.0") == 0)
23523765793SMasatake YAMATO 		{
236759d281dSK.Takata 			verbose ("xslt: accept version: %s\n", version);
237ce990805SThomas Braun 			*acceptable = true;
23823765793SMasatake YAMATO 		}
23923765793SMasatake YAMATO 		else
240759d281dSK.Takata 			verbose ("xslt: unsupported version: %s\n", version);
24123765793SMasatake YAMATO 
24223765793SMasatake YAMATO 		eFree (version);
24323765793SMasatake YAMATO 	}
24423765793SMasatake YAMATO 	else
24523765793SMasatake YAMATO 		verbose ("xslt: version unknown\n");
24623765793SMasatake YAMATO }
24723765793SMasatake YAMATO 
24823765793SMasatake YAMATO static tagXpathTable xsltXpathVersionVerifyTable [] = {
24923765793SMasatake YAMATO 	{ "./@version",
25023765793SMasatake YAMATO 	  LXPATH_TABLE_DO_RECUR,
25123765793SMasatake YAMATO 	  { .recurSpec = { verifyVersion } }},
25223765793SMasatake YAMATO };
25323765793SMasatake YAMATO 
25423765793SMasatake YAMATO 
25523765793SMasatake YAMATO static tagXpathTableTable xsltXpathTableTable[] = {
25623765793SMasatake YAMATO 	[TABLE_MAIN]              = { ARRAY_AND_SIZE (xsltXpathMainTable) },
25723765793SMasatake YAMATO 	[TABLE_STYLESHEET]        = { ARRAY_AND_SIZE (xsltXpathStylesheetTable) },
25823765793SMasatake YAMATO 	[TABLE_VERSION_VERIFY]    = { ARRAY_AND_SIZE (xsltXpathVersionVerifyTable) },
25923765793SMasatake YAMATO 	[TABLE_TEMPLATE]          = { ARRAY_AND_SIZE (xsltXpathTemplateTable) },
26023765793SMasatake YAMATO 	[TABLE_APPLIED_TEMPLATES] = { ARRAY_AND_SIZE (xsltXpathAppliedTemplatesTable) },
26123765793SMasatake YAMATO 	[TABLE_CALL_TEMPLATE]     = { ARRAY_AND_SIZE (xsltXpathCallTemplateTable) },
26223765793SMasatake YAMATO 	[TABLE_PARAM]             = { ARRAY_AND_SIZE (xsltXpathParamTable) },
26323765793SMasatake YAMATO 	[TABLE_VARIABLE]          = { ARRAY_AND_SIZE (xsltXpathVariableTable) },
26423765793SMasatake YAMATO 	[TABLE_WITH_PARAM]        = { ARRAY_AND_SIZE (xsltXpathWithParamTable) },
26523765793SMasatake YAMATO 	[TABLE_CALL_TEMPLATE_INTERNAL] = { ARRAY_AND_SIZE (xsltXpathTemplateInternalTable) },
26623765793SMasatake YAMATO };
26723765793SMasatake YAMATO 
26823765793SMasatake YAMATO 
makeTagRecursivelyWithVersionVerification(xmlNode * node,const char * xpath CTAGS_ATTR_UNUSED,const tagXpathRecurSpec * spec CTAGS_ATTR_UNUSED,xmlXPathContext * ctx,void * userData)26923765793SMasatake YAMATO static void makeTagRecursivelyWithVersionVerification (xmlNode *node,
270513a7223SMasatake YAMATO 						       const char *xpath CTAGS_ATTR_UNUSED,
271e4d16241SMasatake YAMATO 						       const tagXpathRecurSpec *spec CTAGS_ATTR_UNUSED,
27223765793SMasatake YAMATO 						       xmlXPathContext *ctx,
27323765793SMasatake YAMATO 						       void *userData)
27423765793SMasatake YAMATO {
275ce990805SThomas Braun 	bool acceptable = false;
27623765793SMasatake YAMATO 	int backup;
27723765793SMasatake YAMATO 
278971e7196SMasatake YAMATO 	findXMLTags (ctx, node, TABLE_VERSION_VERIFY, &acceptable);
27923765793SMasatake YAMATO 	if (!acceptable)
28023765793SMasatake YAMATO 		return;
28123765793SMasatake YAMATO 
28223765793SMasatake YAMATO 	backup = *(int *)userData;
283971e7196SMasatake YAMATO 	findXMLTags (ctx, node, TABLE_STYLESHEET, userData);
28423765793SMasatake YAMATO 
28523765793SMasatake YAMATO 	*(int *)userData = backup;
28623765793SMasatake YAMATO }
28723765793SMasatake YAMATO 
makeTagRecursively(xmlNode * node,const char * xpath CTAGS_ATTR_UNUSED,const tagXpathRecurSpec * spec,xmlXPathContext * ctx,void * userData)28823765793SMasatake YAMATO static void makeTagRecursively (xmlNode *node,
289513a7223SMasatake YAMATO 				const char *xpath CTAGS_ATTR_UNUSED,
29023765793SMasatake YAMATO 				const tagXpathRecurSpec *spec,
29123765793SMasatake YAMATO 				xmlXPathContext *ctx,
29223765793SMasatake YAMATO 				void *userData)
29323765793SMasatake YAMATO {
29423765793SMasatake YAMATO 	int backup = *(int *)userData;
29523765793SMasatake YAMATO 
296971e7196SMasatake YAMATO 	findXMLTags (ctx, node, spec->nextTable, userData);
29723765793SMasatake YAMATO 
29823765793SMasatake YAMATO 	*(int *)userData = backup;
29923765793SMasatake YAMATO }
30023765793SMasatake YAMATO 
makeTagWithProvidingScope(xmlNode * node CTAGS_ATTR_UNUSED,const char * xpath CTAGS_ATTR_UNUSED,const tagXpathMakeTagSpec * spec CTAGS_ATTR_UNUSED,struct sTagEntryInfo * tag,void * userData)301e4d16241SMasatake YAMATO static void makeTagWithProvidingScope (xmlNode *node CTAGS_ATTR_UNUSED,
302513a7223SMasatake YAMATO 				       const char *xpath CTAGS_ATTR_UNUSED,
303e4d16241SMasatake YAMATO 				       const tagXpathMakeTagSpec *spec CTAGS_ATTR_UNUSED,
30423765793SMasatake YAMATO 				       struct sTagEntryInfo *tag,
30523765793SMasatake YAMATO 				       void *userData)
30623765793SMasatake YAMATO {
30723765793SMasatake YAMATO 	int *index = (int *)userData;
30823765793SMasatake YAMATO 
30923765793SMasatake YAMATO 	tag->extensionFields.scopeIndex = *index;
31023765793SMasatake YAMATO 	*index = makeTagEntry (tag);
31123765793SMasatake YAMATO }
31223765793SMasatake YAMATO 
31323765793SMasatake YAMATO static void
findXsltTags(void)31423765793SMasatake YAMATO findXsltTags (void)
31523765793SMasatake YAMATO {
316f681f9a9SMasatake YAMATO 	scheduleRunningBaseparser (RUN_DEFAULT_SUBPARSERS);
31723765793SMasatake YAMATO }
31823765793SMasatake YAMATO 
319f681f9a9SMasatake YAMATO static void
runXPathEngine(xmlSubparser * s,xmlXPathContext * ctx,xmlNode * root)320f681f9a9SMasatake YAMATO runXPathEngine(xmlSubparser *s,
321f681f9a9SMasatake YAMATO 			   xmlXPathContext *ctx, xmlNode *root)
322f681f9a9SMasatake YAMATO {
323f681f9a9SMasatake YAMATO 	int corkIndex = CORK_NIL;
324f681f9a9SMasatake YAMATO 
325f681f9a9SMasatake YAMATO 	findXMLTags (ctx, root, TABLE_MAIN, &corkIndex);
326f681f9a9SMasatake YAMATO }
327f681f9a9SMasatake YAMATO 
328f681f9a9SMasatake YAMATO static xmlSubparser xsltSubparser = {
329f681f9a9SMasatake YAMATO 	.subparser = {
330f681f9a9SMasatake YAMATO 		.direction = SUBPARSER_BI_DIRECTION,
331f681f9a9SMasatake YAMATO 	},
332f681f9a9SMasatake YAMATO 	.runXPathEngine = runXPathEngine,
333f681f9a9SMasatake YAMATO };
334f681f9a9SMasatake YAMATO 
33523765793SMasatake YAMATO extern parserDefinition*
XsltParser(void)33623765793SMasatake YAMATO XsltParser (void)
33723765793SMasatake YAMATO {
33823765793SMasatake YAMATO 	static const char *const extensions [] = { "xsl", "xslt", NULL };
33923765793SMasatake YAMATO 	parserDefinition* const def = parserNew ("XSLT");
340f681f9a9SMasatake YAMATO 	static parserDependency dependencies [] = {
341f681f9a9SMasatake YAMATO 		[0] = { DEPTYPE_SUBPARSER, "XML", &xsltSubparser },
342f681f9a9SMasatake YAMATO 	};
34323765793SMasatake YAMATO 
34409ae690fSMasatake YAMATO 	def->kindTable         = XsltKinds;
34523765793SMasatake YAMATO 	def->kindCount     = ARRAY_SIZE (XsltKinds);
34623765793SMasatake YAMATO 	def->extensions    = extensions;
34723765793SMasatake YAMATO 	def->parser        = findXsltTags;
34823765793SMasatake YAMATO 	def->tagXpathTableTable = xsltXpathTableTable;
34923765793SMasatake YAMATO 	def->tagXpathTableCount = ARRAY_SIZE (xsltXpathTableTable);
3506b1a862eSMasatake YAMATO 	def->useCork = CORK_QUEUE;
351f681f9a9SMasatake YAMATO 	def->dependencies = dependencies;
352f681f9a9SMasatake YAMATO 	def->dependencyCount = ARRAY_SIZE (dependencies);
353f681f9a9SMasatake YAMATO 
35423765793SMasatake YAMATO 	return def;
35523765793SMasatake YAMATO }
356