<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Deductive Approach to Semistructured Schema Evolution *</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author role="corresp">
							<persName><roleName>Ph.D</roleName><forename type="first">D</forename><surname>Luciv</surname></persName>
							<email>dluciv@lanit-tercom.com</email>
							<affiliation key="aff0">
								<orgName type="institution">Saint-Petersburg State University</orgName>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">B</forename><surname>Novikov</surname></persName>
							<affiliation key="aff0">
								<orgName type="institution">Saint-Petersburg State University</orgName>
							</affiliation>
						</author>
						<title level="a" type="main">Deductive Approach to Semistructured Schema Evolution *</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">0BEFF1C9517CD00C3519DFE0298A9649</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-24T17:29+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Schema evolution for different methodologies is an interesting area of research for now and future.</p><p>Some results of research of semistructured database schema evolution are presented here. Semistructured database schema model based on <ref type="bibr" target="#b10">[11,</ref><ref type="bibr" target="#b3">4]</ref> and its evolution techniques are introduced. Extensions to data model are also described. Some refactoring problems are described. Declarative approach to schema evolution and refactoring is presented.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1">Introduction</head><p>As one of the most popular universal data interchange formats, XML <ref type="bibr" target="#b1">[2]</ref> needs to be structured and constraints applied to XML data are to be formalized.</p><p>XML is now often used for short message interchange and storing small pieces of data for particular applications. Number of such applications is relatively big and in this case data structure of XML can be restricted with only constraints applied by XML itself: the data should have hierarchical form with tags and attributed and should obey XML syntax.</p><p>For more serious applications XML data schema constraints are practically defined and then checked using such means as DTD <ref type="bibr" target="#b11">[12]</ref>, XML Schema <ref type="bibr" target="#b19">[21]</ref>, Relax-NG <ref type="bibr" target="#b0">[1]</ref>, etc. Although for productivity reasons genuine-XML (unparsed textual) data packages are still relatively small for such applications, they can have a complicated structure.</p><p>For all methodologies maintaining data structure is interesting, but difficult. One of research areas is database schema evolution for relational, object-oriented <ref type="bibr" target="#b10">[11]</ref>, semistructured hierarchical <ref type="bibr" target="#b3">[4,</ref><ref type="bibr" target="#b4">5,</ref><ref type="bibr" target="#b9">10,</ref><ref type="bibr" target="#b13">14,</ref><ref type="bibr">15]</ref> databases, and a number of related areas like XML-relational mapping <ref type="bibr" target="#b2">[3,</ref><ref type="bibr" target="#b6">7,</ref><ref type="bibr" target="#b7">8,</ref><ref type="bibr" target="#b13">14]</ref>.</p><p>Traditionally, data schema evolution is not a part of the both object-oriented, relational and semistructured data definition methodologies, however data structure often requires being alterable. This comes from practice. As an illustration we can say that almost any re- lational database has powerful interface for schema altering, and relational databases are mostly used to store large amounts of data. Other kinds of databases often use relational engines behind their semistructured and/or object-oriented interfaces to increase productivity.</p><p>Usually people think about real-world concepts like entities, relations and attributes when modeling the data. The same can be said about data schema evolution controlled by human operator. Existing semistructured database schema evolution techniques provide "lowlevel" evolution operations over particular schema items like tags, attributes, associations, etc. However sometimes operator thinks about more high-level operations like splitting entities, moving attributes from one entity to other, etc -which can be called "refactoring".</p><p>This paper describes some investigations in area of schema evolution and refactoring and possible approaches to it.</p><p>The remaining paper is organized as follows:</p><p>1. related work is analyzed;</p><p>2. basics for semistructured hierarchical data modeling are defined;</p><p>3. restrictions on XPath expressions are defined and applied when modeling associations;</p><p>4. schema invariants are described;</p><p>5. declarative approach to invariants implementation is presented;</p><p>6. declarative approach to refactoring is introduced, refactoring operations are described;</p><p>7. some conclusions are presented.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">Related Work</head><p>Schema evolution is an interesting problem for almost all data modeling methodologies. Object-oriented database schema evolution technique for TIGUKAT ODBMS was proposed in <ref type="bibr" target="#b10">[11]</ref>. This model was selected as basic one to describe schema evolution for hierarchical semistructured databases, particularly, XML in <ref type="bibr" target="#b3">[4]</ref>.</p><p>Both <ref type="bibr" target="#b10">[11]</ref> and <ref type="bibr" target="#b3">[4]</ref> models are simple and illustrative. To make them more flexible, they were modified to handle regular expressions <ref type="bibr" target="#b4">[5]</ref> and reference-based associations <ref type="bibr" target="#b9">[10]</ref>.</p><p>We already have results in extending existing semistructured database model by adding associations to it. Like <ref type="bibr" target="#b4">[5]</ref>, we base on <ref type="bibr" target="#b3">[4]</ref> model for document tag structure. New rules for association evolution are also added.</p><p>Another interesting research area of research is onthology evolution <ref type="bibr" target="#b16">[18,</ref><ref type="bibr" target="#b15">17]</ref>. Some onthology models, like conceptual graphs <ref type="bibr" target="#b14">[16]</ref>, can be considered a conservative extension to first-order logic and used to express XML data model too. Example Prolog interpreter with conceptual graph support can be obtained at http://prologpluscg.sourceforge.net/ as a part of Amine Platform (http://amine-platform.sourceforge.net/).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3">Evolution of Data Schema</head></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.1">Data Modeling Basics</head><p>Let us consider sample data model to be managed (fig. <ref type="figure" target="#fig_0">1</ref>). Given data structure mostly consists of entities and aggregations between them. Some associations are not supported by XML syntax: in fact XML supports only strong aggregation. Other kind of associations that is described in <ref type="bibr" target="#b9">[10]</ref> and in this paper are associations based on XML references. Those associations are one-way navigable.</p><p>The model needs some change to become realistic. Modified model is shown on fig. <ref type="figure">2</ref>. Here we have resolving entities for Street and Building. Two resolving tags for entities those are to be referenced using "? → * " associations are here added to the model. All associations are now references with single direction (as navigability shows). By the way, resulting second model is poorer than first one: for example, we can't list Regions containing given Street using revised data model. All desired invariants (schema axioms) are defined in <ref type="bibr" target="#b3">[4,</ref><ref type="bibr" target="#b9">10]</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.2">Notations and Definitions</head></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.2.1">Basic Notations</head></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.2.2">Restrictions To XPath, Association Modeling</head><p>Here we constrain XPath expression class to be simple enough to analyze. Some of described notions were already defined and used in <ref type="bibr" target="#b9">[10]</ref>, here they are described broader.</p><p>Let us consider association to be reference from tag t towards tag s. Tag s is identified by b attribute, tag t uses a attribute to refer tag s. The reference is implemented using XML key and keyref constructs.</p><p>Example XPath expression looks like " max(/Document/City/Street/Building [parent::Street/@name="Smiths'"]/@number)".</p><p>It contains attributes (@name, @number), axes (implicit child:: and explicit parent::), predicate (...="Smiths'") and term (max(...)). See <ref type="bibr" target="#b17">[19]</ref> for more information.</p><p>Although above XPath expression does not employ every possible XPath functionality (e.g. "|", other operations and advanced features), it is complicated enough. Here we do not need to formalize every kind of XPath expression.</p><p>The biggest own subclass of XPath expressions defined in this paper is a class of Simplified expressions. Such expressions do not use axes (except child::), predicates, terms and operations. The most powerful element of this class is "//" axis. This axis can be easily simulated by substitution of "//" with all possible path sections and then uniting search results. This operation is finite because <ref type="bibr" target="#b3">[4]</ref> does not use cycles in document schemas.</p><p>Simplified expressions, like other XPath expressions, are in real XML documents, not schemas. However Simplified expression can be described using document model terminology. It can be considered as a function p : τ → 2 τ because if we know what tag is an argument instance of, we always know all possible tags which are resulting values instances of.</p><p>We can constrain result set of Simplified expression this way:</p><formula xml:id="formula_0">♯{p(t)} = 1, ∀p ∈ SP, t ∈ τ .</formula><p>Members of such expressions class act as SP ∋ sp : τ → τ . SP class is called Simple expressions here. We here denote the set of simple XPath expressions as SP , so SP (t) is the set of tags s which can be reached from t using simple XPath expressions. So α t (SP (t), υ) ⊂ τ for υ ⊂ τ . We are also to define A as t∈τ N (t). So notation now includes: SP (t) subgraph of τ reached by simple XPath expressions from t A union of all tags' native attributes Above explanations' goal is to make nature of SP easy to understand. Formally we can define SP as {s|t ∈ P L(s)} ∪ t.</p><p>Associations are represented with keys and references <ref type="bibr" target="#b9">[10]</ref>:</p><formula xml:id="formula_1">keydecl : τ × SP × (A ∪ τ ) → K, so K = {f k : {val(m)} → {inst(s ∈ τ )}}, f k is the key function and keyrefdecl : τ × SP × (A ∪ τ ) × K → R, so R = {f r : {inst(t)} → {val(m)}}, f r is the key reference function.</formula><p>Finally, for instances of tags we require</p><formula xml:id="formula_2">f k = keydecl(t 1 , p 1 , m 1 ), f r = keyrefdecl(t 2 , p 2 , m 2 , f k ) t 1 ∈ P L(t 2 ); ∀e 2 ∈ {inst(p 2 (t 2 ))} ∃e 1 ∈ {inst(p 1 (t 1 ))} : (f k • f r )(e 2 ) = e 1 .</formula></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.2.3">Sets</head><p>Following notations for key and reference modeling are introduced by <ref type="bibr" target="#b9">[10]</ref>:</p><formula xml:id="formula_3">KC(f k ) Coverage of key with function f k = keydecl(t, p 1 , a 1 ) RC(f r ) Coverage of reference with function f r = keyrefdecl(s, p 2 , a 2 , f k ′ ) CK(t) Key declarations covering t ∈ τ CR(t)</formula><p>Reference declarations covering t ∈ τ N K(t)</p><p>"Native" key declarations of t ∈ τ N R(t)</p><p>"Native" reference declarations of t ∈ τ CR e (t) "Essential" reference declarations of t ∈ τ . Here we mean reference declarations which base on essential attributes of referencing tag and it's essential parents N R e (t)</p><p>"Essential native" reference declarations of t ∈ τ . Here we mean reference declarations which base on essential attributes of referencing tag</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.2.4">Invariants</head><p>The set of axioms (denoted as ( <ref type="formula">1</ref>)-( <ref type="formula">9</ref>) here) given in <ref type="bibr" target="#b3">[4]</ref> is extended by following ones in <ref type="bibr" target="#b9">[10]</ref>:</p><formula xml:id="formula_4">Axiom Formal representation (KR1) N K(t) = alpha s (keydecl( s, p : p(s) = t, a ∈ N (t)), P L(t)) (KR2) N R(t) = α s (keyrefdecl( s, p : p(s) = t, a ∈ N (t), * ), P L(t)) (KR3) ∀f r ∈ R ∃f k ∈ K : f r = keyrefdecl(t ∈ τ, p ∈ SP, m ∈ (A ∪ τ ), f k ) (KR4) ∀t ∈ τ CR(t) ∈ α s ( keyrefdecl( * , * , * , s), CK(t)) (KR5) N R e (t) = α s (keyrefdecl( s, p : p(s) = t, a ∈ N e (t)), P L(t), * )</formula><p>They are named as axioms of -native keys, -native references, -declaration, -coverage, -"essential" references respectively.</p><p>Consistency and completeness of invariants ( <ref type="formula">1</ref>)-( <ref type="formula">9</ref>) are proved in <ref type="bibr" target="#b3">[4]</ref> by following theorem: Theorem 1 Schema axioms are sound and complete, so if we have P e (t) and N e (t) defined for each tag in schema our schema satisfies axiom set and making changes to this schema is govered by the sets.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Proof is given in[4]</head></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>End of Proof</head><p>Key and reference invariants and formulated in <ref type="bibr" target="#b9">[10]</ref> and proof idea can be expressed as follows:</p><p>Theorem 2 Schema axioms are sound and complete, so if we have P e (t), N e (t), N K(t), N R e (t) defined for each tag in schema our schema satisfies axiom set and making changes to this schema is governed by the sets.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Proof</head><p>Theorem 1 says that schema without key and reference declarations satisfies axioms (1)- <ref type="bibr" target="#b8">(9)</ref> when P e (t) and N e (t) are defined for each tag. But axioms (1)-( <ref type="formula">9</ref>) say nothing about keys and references so new model satisfies those axioms. The same fact relates to model without keys and references and axioms (KR1)-(KR5): no proof needed.</p><p>Hence we are now to prove that keys and references of document schema satisfy new axioms (KR1)-(KR5). All schema invariants are already defined using firstorder logic. Evolution is done by modifying governing sets <ref type="bibr" target="#b3">[4]</ref> and recalculating other ones.</p><p>Possible way to make the schema practically declarative is to assume XML document schema stored in deductive database.</p><p>Description below is equivalent to above schema invariants but can be programmed using Prolog <ref type="bibr" target="#b8">[9]</ref> in nearly unchanged form. However description is simplified here to make it more illustrative yet functional.</p><p>Note that next section describes data schema facts, but does not describe any method to ensure schema is consistent. It is not a vulnerability of the approach: evolution operation set is full, any operation leaves correct schema in correct state, so any correct schema can be "unrolled" from empty one.</p><p>Example set of facts below can be interpreted as state of schema at particular moment. Loading data schema state "as-is" can also be useful, like restoring relational databases from dumps with constraints disabled temporarily for productivity.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.1.1">Facts of Schema</head><p>Facts of deductive databases are used to store information that can not be deduced. This is primary information about data schema.</p><p>Illustration below defines subset of entities from data model shown on fig. <ref type="figure">2</ref>. Schema can be described as follows:</p><p>%---EntityModel tag(':root'). tag(':term'). tag('Document'). tag('City'). tag('Square'). tag('Street'). tag('Region'). tag('res_Street'). inPe('City', 'Document'). inPe('Square', 'City'). inPe('Square', 'Region'). inPe('Street', 'City'). inPe('Region', 'City'). inPe('res_Street', 'Region'). % -non-essential inPe(':term', 'Square'). inPe(':term', 'Street').</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Notes (here and below):</head><p>• Prolog syntax is somewhat changed to optimize paper usage and to group some data;</p><p>• attributes are named uniquely for simplicity to distinguish them by name.</p><p>In case we can use model from fig. <ref type="figure" target="#fig_0">1</ref> directly (our methodology allowed them), we should write a fact like inPe('Street','Region'). Moreover, Schema defined is not complete in area of Region→Street reference because res_Street references Street via reference based on attribute streetref.</p><p>Attributes can be described as follows:</p><p>%---AttribModel inNe('City', 'City@name'). inNe('Street', 'Street@name'). inNe('Region', 'Region@name'). inNe('Square', 'Square@name'). inNe('res_Street', 'res_Street@streetref').</p><p>Two sections of Prolog facts above define almost everything needed to describe model as <ref type="bibr" target="#b3">[4]</ref> proposes, but references defined in <ref type="bibr" target="#b9">[10]</ref> are also to be defined in case when we consider them as evolution object.</p><p>keydecl and keyrefdecl constructs require a bit more explanation before defining them. Reference axiomatic in <ref type="bibr" target="#b9">[10]</ref> is based on key and reference functions which allow us, when superposed, identify referred tag instance for referring one including all references defined for it.</p><p>Those functions are "generated" by keydecl and keyrefdecl which are, formally, functionals. Such a description with functionals and functions can be left almost unchanged when implementing XML DBMS using a kind of functional language for it, but we use logical language to describe data schema here.</p><p>keydecl construct can be used to identify resulting key function keydecl(t, p, a) as:</p><formula xml:id="formula_5">%---RefersModel %----Keys inNK('City', ['Street'], 'Street@name').</formula><p>or, with other context: inNK('Document', ['City', 'Street'], 'Street@name').</p><p>in case we want document-unique street name. It is possible to reach key-covered tag by different ways so we need a list (or other ordered container) to represent path from SP here.</p><p>keyrefdecl functional gets keydecl result as an argument, but it is correct to say that keydecl can be identified by it's argument, so practically keyrefdecl gets 6 parameters in deductive database, e.g.:</p><formula xml:id="formula_6">%---RefersModel %----Refs inNRe( 'City', ['Region', 'res_Street'],</formula><p>'res_Street@streetref', 'City', ['Street'], 'Street@name' ).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.1.2">Goals of Schema</head><p>Sets which are not yet defined using Prolog are calculable and can be omitted theoretically, however <ref type="bibr" target="#b10">[11,</ref><ref type="bibr" target="#b3">4,</ref><ref type="bibr" target="#b9">10]</ref> defined them for simplicity, and we will also use those definitions below.</p><p>In deductive database those sets should not be asserted during schema evolution, they can be considered as "read-only" and calculated using schema invariants. Thus they are defined using goals, not facts.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>%---Calculable Sets % Pred. Graph inPL(S, T) :-inP(S, T). inPL(S, T) :-inP(S, U), U=\=T, inPL(U, T). inPL(S,S).</head><p>% Immediate Pred. inP(T, S) :-inPe(T, S), inPe(T, X), X=\=S, not(inPL(X,S)). inP(T, S) :-inPe(T, S), tag(X), X=\=S, %single Pe not(inPe(T,X)).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>% Inh. attributes inH(T, A) :-inP(T, S), inI(S, A).</head><p>% Native Attributes inN(T, A) :-inNe(T, A), not(inH(T, A)).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>% Interface inI(T, A) :-inN(T, A). inI(T, A) :-inH(T, A).</head><p>% :root &amp; term inPL(_,':root'). inPL(':term',_).</p><p>Above Prolog goals can be used almost without changes except recursive goals for P L sets. In experiments they were optimized and allowed to check if any of arguments are not free term and then decide how to recur. For example, when we try to solve inPL(X, 'City') it is better to recur down from City tag, however axioms and goals above recur upwards only. Calculation of P sets was also changed in practice: in <ref type="bibr" target="#b10">[11,</ref><ref type="bibr" target="#b3">4]</ref> invariants were defined to handle sets of unique elements, however Prolog gives a number of non-unique solutions for inP and inPL above goals (all variants) for any unbound arguments. Practically, some tricks with Prolog cut-off were used. All those tricks and optimizations are beyond this paper.</p><p>Detailed descriptions of sets above and formulae for schema invariants are placed in <ref type="bibr" target="#b3">[4]</ref>. Those formulae are used "as-is" their calculation require no imperative description at all. N K(τ ) and N R e (τ ) sets are governing sets for keys and references, other are calculated. Invariants from <ref type="bibr" target="#b9">[10]</ref> can be described like this: last(l, e) :eq(l, (h)), eq(e, h). last(l,e) :eq(l, (h|t)), last(t,e). inNR(Rtag, Rpath, Rattr, Ktag, Kpath, Kattr):-inNRe(Rtag, Rpath, Rattr, Ktag, Kpath, Kattr), last(Rpath, RRtag), inN(RRtag, Rattr).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.2">Declarative Approach to Evolution</head><p>Basic operations which were initially defined in <ref type="bibr" target="#b3">[4]</ref> for the data model without associations are modified to handle references. Evolution operations from <ref type="bibr" target="#b9">[10]</ref> are here defined considering schema as deductive database described above.</p><p>Note that we use some ISO Prolog goals like findall(Var, Term, Result) <ref type="bibr" target="#b5">[6]</ref>. However Prolog code below can be used as-is, this code is dedicated to illustrate main ideas of possible schema evolution engine implementation. Some checks are here omitted and evolution operations are defined as simply as possible.</p><p>Evolution operations are labeled «evo.M.N» below.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>evo.1.1. adding new attribute</head><p>Rule described in <ref type="bibr" target="#b3">[4]</ref>. No additional requirements and activities needed. addAttribute(Tag,Attr) :tag(Tag), assert(inNe(Tag,Attr)).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>evo.1.2. deleting attribute</head><p>When deleting attribute a of tag t, all key declarations in N K(t) and references in N R(t) are deleted. See operation of key removal (3.2) below.</p><p>As noted in <ref type="bibr" target="#b3">[4]</ref>, an ability to add deleted attribute to N e of tags in SP (t) is useful. Implementation of this functionality should also redeclare keys in N K(t) and references in N R(t). Sample implementation is cumbersome and omitted here.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>evo.2.1. adding aggregation between two tags</head><p>Rule described in <ref type="bibr" target="#b3">[4]</ref>. No additional requirements and activities needed. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>evo.2.2. removing aggregation between two tags</head><p>This operation is relatively complicated in both [4] and here.</p><p>Let us call aggregated tag t.</p><p>All key declarations in N K(t) are modified to satisfy (KR4) axiom. This means that declarations move upward unless they cover all references again. Note that if t is no more aggregated by other tags it implicitly becomes child of root tag ⊤, and all corresponding key declarations move to ⊤.</p><p>All reference declarations in N R(t) are deleted if they become invalid. All reference declarations in t move up to save references in α s (N R(s), SP (t)).</p><p>A sample code (qualitatively simplified) here executes key redeclaration according to (KR4). </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>evo.2.3. adding new tag</head><p>The rule is described in <ref type="bibr" target="#b3">[4]</ref>. No additional requirements and activities needed. Prolog goal below also illustrates some checks of bound variables. Those checks are useful live applications. addTag(Tag, PeList) :findall(X, (member(X, PeList), not(tag(X))), BadList), %only sample check length(BadList, 0), % they all are tags assert(tag(Tag)), findall(X, (member(X, PeList), addAggregation(Tag, X)), Successfull), addAggregation(':term', Tag).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>evo.2.4. removing a tag</head><p>The rule is described in <ref type="bibr" target="#b3">[4]</ref> for basic structure without keys and references. Removed tag is called t. Like in operation (1.2) of attribute removal, the reference declarations in N R e (t) can be modified to cover all children of t. For all such reference declarations we are to create corresponding reference attributes in children of t. Sample Prolog implementation is not placed here because of its awkwardness.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>evo.3.1. declaring new key</head><p>Key declaration is canceled if it does not satisfy one or more of (KR1)-(KR5). Sample Prolog code omits checks because they are cumbersome and can be considered as unnecessary technical details here. It requires almost no checks in theory, either. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>evo.3.2. removing a key</head><p>During key declaration f k = keydecl(t, p, a) removal, all reference declarations f r = keyrefdecl(t ′ , p ′ , a ′ , f k ) are also removed. Sample Prolog implementation is not interesting enough to place here.</p><p>With current key-reference model is is the only way to perform such an operation. However if we support Simplified XPath expressions instead of Simple ones, we can identify instances of many tags with one key. In this case we potentially can redeclare the key by adding it to N K sets of t tag's children. This will keep references to f k unchanged. But this case is not considered here.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>evo.4.1. declaring new reference</head><p>Reference declaration is canceled if it does not satisfy one or more of (KR1)-(KR5). Sample Prolog implementation is not interesting enough to place it here.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>evo.4.2. removing reference</head><p>This operation does not require any additional operations. Like operation (1.2), it can be compensated with declaration of references belonging to N R sets of some child tags. Sample Prolog implementation is not interesting enough to place here.</p><p>In case when we support simplified XPath expressions, we can cover some child tags with one reference declaration instead of declaring new references, but we do not consider this way here as it was noted for (3.2) operation.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.3">Declarative Approach to Refactoring</head><p>Human-language description of evolution operations is cumbersome and complicated. However this is only a set of possible low-level schema modification operations. Refactoring operations are rather more complicated than ones above. Imperative description of refactoring operations should be even more complicated and unclear so defining them in declarative way seems to be a way to simplify them.</p><p>Here some possible refactoring operations are listed and sample implementation ideas provided.</p><p>Wider operation list can be found at http://www.agiledata.org/ in Database Refactoring Catalog section.</p><p>Refactoring operations listed below are mostly projected into sequences of schema evolution operations. Some of refactoring operations require analysis of real data corresponding to given schema. Some of them are unapplicable yet because XML Schema support in data model above is not yet powerful enough.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.3.1">Refactoring Operations over Existing Data Model</head><p>Refactoring operations defined and described below are labeled «rft.N» below.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>rft.1. consolidating attributes representing single concept</head><p>For attributes, which represent single concept, consolidation can be executed. For example, address is sometimes represented by two strings and can be consolidated into one string.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>rft.2. consolidating tags</head><p>Sometimes two model tags can be consolidated because they can be interpreted as the same entity.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>rft.3. splitting an attribute</head><p>Splitting an attribute is useful when the model is growing from more simple one or from a prototype. Example above can be reversed: if we know particular addressing system, we can divide attribute into smaller ones representing more atomic values.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>rft.4. splitting a tag</head><p>Splitting a tag can be useful, for example, when we would like to detach a child tag from parent (instead of adding attributes to all instances of existing tag).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>rft.5. adding a key to data schema</head><p>Adding new key operation is basic evolution operation and it is already defined. Although in real databases adding a key to schema can be also combined with integrity checking and index creation. Automating of those tasks can lead to complicated refactoring operation.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>rft.6. adding new attribute to avoid referencing</head><p>Instead of dereferencing other entity to obtain the value of single attribute, we can store this attribute in the referencing entity. Although productivity can be essentially improved, this approach can lead us to inconsistent data.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>rft.7. moving an attribute</head><p>Moving from one tag to another lets us to:</p><p>• avoid possible referencing when accessing attributes of different entities; • separate seldomly-used attributes to improve productivity; • separate read-only attributes if DBMS has no permission support below entity level or when it helps DBMS to optimize its work. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>rft.9. safe-deleting entity</head><p>This refactoring operation is already supported as elementary evolution operation.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>rft.10. replacing existing natural key with surrogate one</head><p>This operation declares new key and probably removes existing one (existing key becomes simply an attribute). It can also try to maintain references to initial key and switch them to new one.</p><p>The purpose of this operation is to change key semantics.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>rft.11. replacing "1 → * " aggregative association with " * → * " one</head><p>As an example we can imagine that we are going to let the streets to pass across several cities (fig. <ref type="figure">2</ref>). In this case Street becomes a child of Document and new resolver between City and Street is constructed as shown at fig. <ref type="figure" target="#fig_4">3</ref>.</p><p>For this refactoring operation sample implementation is provided. It is quite simple (some supplementary goals are also defined, obvious goals are used without definition):  </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>rft.14. adding cascade delete for weak entities</head><p>This operation creates implicit triggers in underlying DBMS in case one exists to delete weak entities when their parents are destroyed.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>rft.15. discover groups and turn them into entities</head><p>Existing data can be analyzed to discover repeating values of attributes and tags. Some of them can be merged and then replaced with references to newly created merged groups.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5">Conclusion</head><p>Given association evolution model makes a contribution to existing XML schema evolution models. Although given model does not provide full support of XML Schema or even DTD constructions, it seems to be enough powerful for usage with real XML documents.</p><p>Model can be modified if needed. For example, support of simplified XPath expressions can make model much more flexible. New association model can be also integrated into document model described in <ref type="bibr" target="#b4">[5]</ref> instead of <ref type="bibr" target="#b3">[4]</ref>. Both solutions increase model flexibility and DTD or XML schema support, but resulting model will be still not enough powerful to support complete DTD and XML schema. Both solutions lead to complicated model that is not so illustrative as given one, so they are to be used in cases when their techniques are useful for particular applications.</p><p>It can be sensible to combine some other set calculation models together with Prolog goal approvals. Sample sample system is term rewriting engine <ref type="bibr" target="#b12">[13]</ref> available at http://www.gradsoft.com.ua/.</p><p>Although above paper describes schema evolutions, one of possible applications of given evolution rules is automatic transformation of XML documents content. For example, two versions of database can have different XML representation of their data. On-the-fly transformations of XML content can help legacy applications to access new database and can also make legacy database available for new applications. Transformation itself can be composed using operations described in this paper. For real world application this transformation can be executed by XSLT <ref type="bibr" target="#b18">[20]</ref> generated from evolution operations list.</p><p>For XML document with complicated structure it is easier for human operator to think about more "highlevel" transformations, than most of primitive evolution operations defined in <ref type="bibr" target="#b3">[4,</ref><ref type="bibr" target="#b4">5,</ref><ref type="bibr" target="#b9">10]</ref> and here. Such operations, like splitting entity or moving attribute from one entity to another, etc. should be considered schema refactoring, because in their case simple local changes often induce global changes to whole schema. Some of possible schema refactoring operations are described here and are also objects of future investigations.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>Figure 1 :</head><label>1</label><figDesc>Figure 1: Data Structure</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head></head><label></label><figDesc>addAggregation(Tag,Parent) :tag(Tag), tag(Parent), assert(inPe(Tag,Parent)).</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head></head><label></label><figDesc>leastCommonEPL(Tag1,Tag2,Pred,Path1,Path2) :-... . % finds least common predecessor in both % PL(Tag1)\{Tag1} and PL(Tag2)\{Tag2} and % pathes to it. Trivial but cumbersome. retractDependentRefs(Child, Parent, DKP) :findall((RT,RP,RA,KT,KP,KA), (inNRe(RT,RP,RA,KT,KP,KA), member(Child, KP),member(Parent, [KT | KP]), retract(inNRe(RT,RP,RA,KT,KP,KA)) ), DKP). correctKeyRefs(Child, Parent, DK) :findall(inNRe(RT,RP,RA,KT,KP,KA), (inNRe(RT,RP,RA,KT,KP,KA), member(Child, KP), member(Parent, [KT | KP]), retract(inNRe(RT,RP,RA,KT,KP,KA)), retract(inNR(KT,KP,KA)), leastCommonEPL(Parent,Child,LKE,PPath,CPath), addKey(LKE,CPath,KA), addReference(RT,RP,RA,LKE,PPath,KA) ), DK). Then we can invoke them: removeAggregation(Child,Parent) :-retractDependentRefs(Child, Parent, _), correctKeyRefs(Child, Parent, _), retract(inPe(Child,Parent)).</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head></head><label></label><figDesc>addKey(ContextTag, Path, KeyAttr) :-% no checks assert(inNK(ContextTag, Path, KeyAttr)).</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head>Figure 3 :</head><label>3</label><figDesc>Figure 3: Refactoring Model fragment</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_5"><head></head><label></label><figDesc>useOrCreateKey(Tag, PathWithoutLast, KeyTag, KeyAttr, MustReferTag):concat(PathWithoutLast, [KeyTag], Path), inNK(Tag, Path, KeyAttr), inPL(MustReferTag, Tag), !. %one is enough useOrCreateKey(Tag, PathWithoutLast, KeyTag, KeyAttr, MustReferTag):-leastCommonEPL(KeyTag,MustReferTag, Tag,Path,RPath), KeyAttr = Keytag + '@idFor_' + MustReferTag, addAttribute(KeyTag, KeyAttr), addKey(Tag, Path, KeyAttr), removeLast(Path, PathWithoutLast). replaceAggregationWithResolver (Child, Parent, ResName) :-ResName = 'res_' + Parent + '_' + Child, addTag(ResName, [Parent]), removeAggergation(Child, Parent), RefAttrName = ResName + '@' + Child + 'ref', addAttribute(ResName, RefAttrName), useOrCreateKey(Tag, PathWithoutLast, Child, KeyAttr, ResName), concat(PathWithoutLast, [KeyTag], Path), onePathFromTo(ResName, Tag, ResPath),!, %gives one, cuts off. addReference( Tag, ResPath, RefAttrName, Tag, Path, KeyAttr ).</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_0"><head>Proceedings of the Spring Young Researcher's Colloquium on Database and Information Systems SYRCoDIS, St.-Petersburg, Russia, 2005</head><label></label><figDesc></figDesc><table /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_2"><head>of Proof 4 Declarative Approach 4.1 Description of Schema</head><label></label><figDesc></figDesc><table><row><cell>(KR1),(KR2) Those axioms are satisfied obviously</cell></row><row><cell>due to key and reference semantics</cell></row><row><cell>presented here.</cell></row><row><cell>(KR3) Every reference should base on corre-</cell></row><row><cell>sponding key.</cell></row><row><cell>(KR4) We have noted above that reference</cell></row><row><cell>coverage is always contained by key</cell></row><row><cell>coverage. Thus if we use reference</cell></row><row><cell>covering our tag, we are also to have</cell></row><row><cell>key declaration covering our tag.</cell></row><row><cell>(KR5) Like (KR1),(KR2) is satisfied due to</cell></row><row><cell>reference semantics. It is always able</cell></row><row><cell>to build N R(t) set using N R e (t) and</cell></row><row><cell>N (t) sets.</cell></row><row><cell>End</cell></row></table></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_3"><head>4.3.2 Refactoring Operations over Advanced XML Data Structures and Models rft.12. renaming anything</head><label></label><figDesc>This refactoring operation is placed in "advanced" section because current data model does not handle such advanced XML naming facilities as namespaces, etc. If these facilities are appropriately supported, renaming tag, attribute, key or any other entity in XML data model becomes complicated task. rft.</figDesc><table /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_4"><head>13. restore standard types for attributes</head><label></label><figDesc>Theoretically, this operation is very interesting. Refactoring engine should analyze user types defined in data schema, perform some calculations of corresponding domains and decide if some of types can be replaced by built-in (like integer) types. Moreover, merging similar types (and type fragments of compound types) and simplifying type description is very interesting computer science problem. This interesting operation is beyond current work.</figDesc><table /></figure>
		</body>
		<back>

			<div type="funding">
<div xmlns="http://www.tei-c.org/ns/1.0"><p>* This research was partially supported by Microsoft Research grant No. 2004-459A and RFBR grant No. 04-01-00173</p></div>
			</div>

			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<monogr>
		<title level="m" type="main">Relax ng compact syntax</title>
		<imprint>
			<date type="published" when="2002-11">November 2002</date>
		</imprint>
	</monogr>
	<note type="report_type">Specification</note>
</biblStruct>

<biblStruct xml:id="b1">
	<monogr>
		<title level="m">Extensible markup language (XML) 1.0</title>
				<editor>
			<persName><forename type="first">T</forename><surname>Bray</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">J</forename><surname>Paoli</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">C</forename><forename type="middle">M</forename><surname>Sperberg-Mcqueen</surname></persName>
		</editor>
		<imprint>
			<date type="published" when="2000">2000</date>
		</imprint>
	</monogr>
	<note>2nd edition). W3C Recommendation</note>
</biblStruct>

<biblStruct xml:id="b2">
	<monogr>
		<title level="m" type="main">On relational support for XML publishing: Beyond sorting and tagging</title>
		<author>
			<persName><forename type="first">Surajit</forename><surname>Chaudhuri</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Raghav</forename><surname>Kaushik</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Jeffrey</forename><forename type="middle">F</forename><surname>Naughton</surname></persName>
		</author>
		<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Xml database schema evolution axiomatization</title>
		<author>
			<persName><forename type="first">S</forename><surname>Coox</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Programming and Computer Software</title>
		<imprint>
			<biblScope unit="volume">29</biblScope>
			<biblScope unit="issue">3</biblScope>
			<biblScope unit="page" from="140" to="146" />
			<date type="published" when="2003">2003</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<monogr>
		<author>
			<persName><forename type="first">V</forename><surname>Sergey</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Andrey</forename><forename type="middle">A</forename><surname>Coox</surname></persName>
		</author>
		<author>
			<persName><surname>Simanovsky</surname></persName>
		</author>
		<title level="m">Regular expressions in xml schema evolution</title>
				<meeting><address><addrLine>Kharkiv, Ukraine</addrLine></address></meeting>
		<imprint>
			<publisher>ISTA</publisher>
			<date type="published" when="2003-06">June 2003</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<monogr>
		<title level="m" type="main">a di Bologna a Cesena, Italy. tuProlog User&apos;s Guide</title>
		<imprint>
			<date type="published" when="2002-09">Sep 2002</date>
		</imprint>
		<respStmt>
			<orgName>DEIS, Universit&apos;</orgName>
		</respStmt>
	</monogr>
	<note>1st edition</note>
</biblStruct>

<biblStruct xml:id="b6">
	<monogr>
		<title level="m" type="main">A performance evaluation of alternative mapping schemes for storing XML data in a relational database</title>
		<author>
			<persName><forename type="first">D</forename><surname>Florescu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Kossmann</surname></persName>
		</author>
		<idno>- port 3684</idno>
		<imprint>
			<date type="published" when="1999">1999</date>
		</imprint>
		<respStmt>
			<orgName>INRIA</orgName>
		</respStmt>
	</monogr>
	<note type="report_type">Technical Re</note>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">Storing and querying xml data using an rdbms</title>
		<author>
			<persName><forename type="first">D</forename><surname>Florescu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Kossmann</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Data Engineering Bulletin</title>
		<imprint>
			<biblScope unit="volume">22</biblScope>
			<biblScope unit="page" from="27" to="34" />
			<date type="published" when="1999">1999</date>
			<publisher>IEEE</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<monogr>
		<title level="m" type="main">Prolog -Programming for Tomorrow</title>
		<author>
			<persName><forename type="first">J</forename><surname>Doores</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><forename type="middle">R</forename><surname>Reiblein</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Vadera</surname></persName>
		</author>
		<imprint>
			<date type="published" when="1987">1987</date>
			<publisher>Sigma Press</publisher>
			<pubPlace>Wilmslow, UK</pubPlace>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<analytic>
		<title level="a" type="main">Semistructured database scheme evolution and refactoring</title>
		<author>
			<persName><forename type="first">V</forename><surname>Dmitry</surname></persName>
		</author>
		<author>
			<persName><surname>Luciv</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">SYRCoDIS</title>
				<imprint>
			<date type="published" when="2004-05">May 2004</date>
			<biblScope unit="page" from="71" to="74" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<monogr>
		<title level="m" type="main">Axiomatization of dynamic schema evolution in objectbases</title>
		<author>
			<persName><forename type="first">M</forename><forename type="middle">Tamer</forename><surname>Oszu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Randal</forename><forename type="middle">J</forename><surname>Peters</surname></persName>
		</author>
		<imprint>
			<date type="published" when="1997">1997</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<monogr>
		<title level="m" type="main">Learning XML</title>
		<author>
			<persName><forename type="first">Erik</forename><forename type="middle">T</forename><surname>Ray</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2001">2001</date>
			<publisher>O&apos;Reilly</publisher>
			<biblScope unit="page" from="143" to="189" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<monogr>
		<title level="m" type="main">The system of symbolic computing for programming the dynamic applications</title>
		<author>
			<persName><forename type="first">R</forename><surname>Shevchenko</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Doroshenko</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2003">2003</date>
		</imprint>
	</monogr>
	<note>Interntet publication. in russian)</note>
</biblStruct>

<biblStruct xml:id="b13">
	<analytic>
		<title level="a" type="main">Evolution of schema of xmldocuments stored in a relational database</title>
		<author>
			<persName><forename type="first">A</forename><surname>Simanovsky</surname></persName>
		</author>
		<author>
			<persName><surname>Andrew</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Applying the reconfiguration-design formalism to xml stored in a relational database</title>
				<meeting><address><addrLine>Riga, Latvia</addrLine></address></meeting>
		<imprint>
			<publisher>SYRCoDIS</publisher>
			<date type="published" when="2004-05">2004. May 2004</date>
			<biblScope unit="page" from="75" to="77" />
		</imprint>
	</monogr>
	<note>proceedings of Baltic DB&amp;IS</note>
</biblStruct>

<biblStruct xml:id="b14">
	<analytic>
		<title level="a" type="main">Conceptual graphs</title>
		<author>
			<persName><forename type="first">John</forename><forename type="middle">F</forename><surname>Sowa</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">ISO/JTC1/SC 32/WG2</title>
				<imprint>
			<date type="published" when="2001-04">April 2001</date>
		</imprint>
	</monogr>
	<note>Standard Draft</note>
</biblStruct>

<biblStruct xml:id="b15">
	<analytic>
		<title level="a" type="main">Ontology evolution as reconfigurationdesign problem solving</title>
		<author>
			<persName><forename type="first">L</forename><surname>Stojanovic</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Maedche</surname></persName>
		</author>
		<author>
			<persName><forename type="first">N</forename><surname>Stojanovic</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Studer</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">proceedings of International Conference on Knowledge Management</title>
				<meeting>International Conference on Knowledge Management</meeting>
		<imprint>
			<date type="published" when="2003">2003</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b16">
	<analytic>
		<title level="a" type="main">Model-based reconfiguration</title>
		<author>
			<persName><forename type="first">M</forename><surname>Stumptner</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Wotawa</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">proceedings Artificial Intelligence in Design</title>
				<meeting>Artificial Intelligence in Design<address><addrLine>Lisbon, Portugal</addrLine></address></meeting>
		<imprint>
			<date type="published" when="1998">1998</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b17">
	<monogr>
		<title level="m" type="main">XML Path Language (XPath)</title>
		<author>
			<persName><surname>W3c</surname></persName>
		</author>
		<imprint>
			<date type="published" when="1999-11">November 1999</date>
		</imprint>
	</monogr>
	<note>1.0 edition</note>
</biblStruct>

<biblStruct xml:id="b18">
	<monogr>
		<author>
			<persName><surname>W3c</surname></persName>
		</author>
		<title level="m">XSL Transformations (XSLT)</title>
				<imprint>
			<date type="published" when="1999-11">November 1999</date>
		</imprint>
	</monogr>
	<note>1.0 edition. Recommendation</note>
</biblStruct>

<biblStruct xml:id="b19">
	<monogr>
		<title level="m" type="main">XML Schema Part 0: Primer</title>
		<author>
			<persName><surname>W3c</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2001-05">May 2001</date>
		</imprint>
	</monogr>
	<note>Recommendation</note>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
