130 likes | 228 Views
XML Name spaces. Different people may invent similar tag names. Here is an XML element describing a piece of furniture: <table> <name>table99</name> <type>dining table</type> <width>80</width> <length>180</length> </table>
E N D
Different people may invent similar tag names • Here is an XML element describing a piece of furniture: <table> <name>table99</name> <type>dining table</type> <width>80</width> <length>180</length> </table> • Here is an XML element describing a collection of data: <table> <person> <name>Bertie Ahern</name> <type>male</type> </person> <person> <name>Mary Harney</name> <type>female</type> </person> </table>
Distinguishing tags with similar names • Sometimes an application will involve multiple documents, each containing tags that have the same names but different meanings • We can distinguish between similar tag names by using prefixes
Distinguishing tags with similar names (contd.) • The XML element describing a piece of furniture: <furniture:table> <furniture:name>table99</furniture:name> <furniture:type>dining table</furniture:type> <furniture:width>80</furniture:width> <furniture:length>180</furniture:length> </furniture:table> • The XML element describing a collection of data: <data:table> <data:person> <data:name>Bertie Ahern</data:name> <data:type>male</data:type> </data:person> <data:person> <data:name>Mary Harney</data:name> <data:type>female</data:type> </data:person> </data:table>
Distinguishing tags with similar names (contd.) • But two different software engineers might even still choose similar prefixes! • Extract from one application: <furniture:table> <furniture:name>table99</furniture:name> <furniture:type>dining table</furniture:type> <furniture:width>80</furniture:width> <furniture:length>180</furniture:length> </furniture:table> • Extract from another application: <furniture:table> <furniture:price>199</furniture:price> <furniture:status>second-hand</furniture:status> </furniture:table>
Distinguishing tags with similar names (contd.) • We avoid ambiguity by associating each prefix with something that must be unique • a Universal Resource Identifier • The association between a prefix and a URI is made using a special XML attribute • the XML Namespace (xmlns) Attribute • Format of the xmlns attribute: xmlns:prefix="URI” • Example usages: <furniture:table xmlns:furniture=“http://abc.com”> <furniture:table xmlns:furniture=“http://abracadabra.co.uk”> • By the way: never invent your own tag/attribute names starting with “xml…” • these are reserved for W3C usage
Distinguishing tags with similar names (contd.) • When a namespace is defined in the start tag of an element, all child elements with the same prefix are associated with the same namespace • Example <furniture:table xmlns:furniture=“http://abc.com” > <furniture:name>table99</furniture:name> <furniture:type>dining table</furniture:type> <furniture:width>80</furniture:width> <furniture:length>180</furniture:length> </furniture:table> • In this case, all the furniture prefixes are associated with the http://abc.com URI
Some more examples • A different furniture example: <furniture:table xmlns:furniture=“http://abracadabra.co.uk”> <furniture:price>199</furniture:price> <furniture:status>second-hand</furniture:status> </furniture:table> • A personnel data example <data:table xmlns:data=“http://irlgov.ie”> <data:person> <data:name>Bertie Ahern</data:name> <data:type>male</data:type> </data:person> <data:person> <data:name>Mary Harney</data:name> <data:type>female</data:type> </data:person> </data:table>
Default Namespaces • We can reduce the need for prefixes if we define a default namespace for an element • All tag names in descendant elements are then understood as implicitly having the same namespace as that for the ancestor element • The format for a default namespace usage is <someTagName xmlns=“someURI” > … </someTagName> • Example usage: <furniture:table xmlns:furniture=“http://abracadabra.co.uk”> <furniture:price>199</furniture:price> <furniture:status>second-hand</furniture:status> </furniture:table> is equivalent to: <table xmlns=“http://abracadabra.co.uk”> <price>199</price> <status>second-hand</status> </table>
Example usage of XML namespaces • A frequent usage of namespaces is in XSL stylesheets • There is an example on the next slide • The XSL stylesheet transforms a particular form of XML document into XHTML • Thus many of the tags in the stylesheet are XHTML tags • But many tags are are XSL tags • they are identified as such by having the xsl prefix • and the semantics of the xsl prefix are defined by associating it with a W3C URI
<?xml version="1.0"?> <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform” version="1.0"> <xsl:template match="/"> <html><head><title>Data</title></head> <body><table rules="all"> <thead><tr><th>Name</th><th>Sex</th></tr></thead> <tbody> <xsl:apply-templates/> </tbody></table></body></html> </xsl:template> <xsl:template match="person"> <tr><xsl:apply-templates/></tr> </xsl:template> <xsl:template match="male"> <td><xsl:value-of select="."/></td><td>male</td> </xsl:template> <xsl:template match="female"> <td> <xsl:value-of select="."/> </td><td>female</td> </xsl:template> </xsl:transform>
An XSL application where there would have been tagname clashes • Consider the following XML fragment: <table xmlns=“http://abc.com” > <name>table99</name> <type>dining table</type> <width>80</width> <length>180</length> </table> • Supposewe wanted to use XSL to transform elements like this into elements like this <table xmlns=“http://abc.com” > <name>table99</name> <template>dining table</template> <width>80</width> <length>180</length> </table> • That is, we are replacing an application-specific element having the tagname type with one having the tagname template
An XSL application with potential tagname clash (contd.) • Our XSL stylesheet would have two kinds of template element • one from the XSL language • another from the application-specific furniture language • We would use the xsl prefix to distinguish one of these from the other • Here is an extract from the relevant XML stylesheet: <?xml version="1.0"?> <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform” version="1.0"> ... <xsl:template match="type"> <template><xsl:value-of select="."/></template> </xsl:template> ... <xsl:transform>