Using XSL where source docuement has DOCTYPE/DTD declaration

Ken Larson

Usenet Archive
Joined
Jan 15, 2004
Messages
7
Reaction score
0
I have a question about using XSL to extract information from an SVG (XML) file that has a DOCTYPE/DTD declaration. I am able to do this successfully if I write my own SVG files without such a declaration.

However, I would like to extract some parts of an SVG file exported by illustrator. When I try this, my XSL file is no longer able to access the nodes in the SVG document properly - somehow related to the DOCTYPE/DTD declaration.

My SVG is as follows (I stripped out all of the actual contents for testing). If I remove the entire DOCTYPE/DTD declaration, everything works fine.

<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 11.0, SVG Export Plug-In . SVG
Version: 6.0.0 Build 78) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [ <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/"> <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/"> <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/"> <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/"> <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/"> <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/"> <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/"> <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/"> <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/"> <!ENTITY ns_svg "http://www.w3.org/2000/svg"> <!ENTITY ns_xlink "http://www.w3.org/1999/xlink"> ]> <svg> <style type="text/css"> </style> </svg>

My XSL follows. It simply prints "Found SVG" if it finds the svg node. Like I said, it finds it if the SVG doesn't have the whole DOCTYPE/DTD declaration. But if I leave the DOCTYPE/DTD declaration in, it only finds the root.

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
Found Root

<xsl:apply-templates select="svg" />

</xsl:template>

<xsl:template match="svg">
Found SVG
</xsl:template>

Thanks,

Ken Larson
 

Philippe Poulard

Usenet Archive
Joined
Dec 20, 2001
Messages
412
Reaction score
0
Ken said:
I have a question about using XSL to extract information from an SVG (XML) file that has a DOCTYPE/DTD declaration. I am able to do this successfully if I write my own SVG files without such a declaration.

However, I would like to extract some parts of an SVG file exported by illustrator. When I try this, my XSL file is no longer able to access the nodes in the SVG document properly - somehow related to the DOCTYPE/DTD declaration.

My SVG is as follows (I stripped out all of the actual contents for testing). If I remove the entire DOCTYPE/DTD declaration, everything works fine.

<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 11.0, SVG Export Plug-In . SVG
Version: 6.0.0 Build 78) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [ <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/"> <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/"> <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/"> <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/"> <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/"> <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/"> <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/"> <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/"> <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/"> <!ENTITY ns_svg "http://www.w3.org/2000/svg"> <!ENTITY ns_xlink "http://www.w3.org/1999/xlink"> ]> <svg> <style type="text/css"> </style> </svg>

My XSL follows. It simply prints "Found SVG" if it finds the svg node. Like I said, it finds it if the SVG doesn't have the whole DOCTYPE/DTD declaration. But if I leave the DOCTYPE/DTD declaration in, it only finds the root.

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
Found Root

<xsl:apply-templates select="svg" />

</xsl:template>

<xsl:template match="svg">
Found SVG
</xsl:template>

Thanks,

Ken Larson

hi,

as mentionned in the dtd :

For SVG 1.0:

Namespace:
http://www.w3.org/2000/svg

<!ATTLIST svg
xmlns CDATA #FIXED "http://www.w3.org/2000/svg"

svg is in a namespace

your xslt has not been designed to match svg elements, but can only match an element called "svg" not bound to the svg uri

you *must* defined a prefix to use qualified names in xslt :

this will work :

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:svg="http://www.w3.org/2000/svg" version="1.0">

<xsl:template match="/">
Found Root

<xsl:apply-templates select="svg:svg" />

</xsl:template>

<xsl:template match="svg:svg">
Found SVG
</xsl:template>

remember that unprefixed attributes are not bound to any namespace, so use xpath expressions like this :
/svg:svg/svg:style/@type
instead of :
/svg:svg/svg:style/@svg:type
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
548,042
Messages
3,104,224
Members
248,132
Latest member
henrywalsh

Latest Threads

Top