Re: [xml] Fwd: continued problem with Python, libxml2 and entities



Mike,

You should tell libxml2 to resolve entities before doing any XSLT
processing. In your test.py, use

sourcedoc = libxml2.readFile( 'test.xml', None, libxml2.XML_PARSE_NOENT
)

If you look at pyxsltproc.py you will see that it does the same trick
with a global setting ( libxml2.substituteEntitiesDefault(1) ) but I
believe this way of doing is deprecated.

-sbi 

-----Original Message-----
From: xml-bounces gnome org [mailto:xml-bounces gnome org] On 
Behalf Of Mike Kneller
Sent: lundi 29 janvier 2007 15:29
To: xml gnome org
Subject: [xml] Fwd: continued problem with Python, libxml2 
and entities

It turns out that the same transform run through xsltproc 
gives the correct result. 

What I am expecting to see is: 
<?xml version="1.0"?>
<content> 
        <p>(c)2007</p>
</content> 

When I run it using test.py, the result I get is: 
<?xml version="1.0"?>
<content> 
        <p>2007</p>
</content> 

So, as the xsltproc version gives me the correct result, I 
guess I can eliminate the library as the source of the 
problem, instead it would appear to be a problem with my 
Python code, or the Python wrapper. 

Any ideas? 

Mike 


From: "Mike Kneller" <ukchill mac com>
To: <xml gnome org>
Date: January 28, 2007 09:26:40 AM PST
Subject: [xml] continued problem with Python, libxml2 and entities

The continuing saga!

I seem to have moved the entity issue from libxml2 to libxslt...

Using the following testcase (using a standard identity
transformation) now loses the entity.

replacing <xsl:copy> with <xsl:copy-of> on the <p> node 
produces output 
with the entity, as does using <xsl:value-of> on the same node.

===test.py===
import libxml2
import libxslt

sourcedoc = libxml2.parseFile( 'test.xml' ) styledoc = 
libxml2.parseFile( 'test.xsl' ) style = 
libxslt.parseStylesheetDoc(styledoc)
result = style.applyStylesheet(sourcedoc, None) print 
style.saveResultToString( result )
style.freeStylesheet()
result.freeDoc()
sourcedoc.freeDoc()


===test.xml===
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="test.xsl" ?>

<!DOCTYPE content [
    <!ENTITY copy "&#169;">
]>

<content>
    <p>&copy;2007</p>
</content>


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


<xsl:template match="/">
    <xsl:apply-templates match="." />
</xsl:template>

<xsl:template match="@*|node()">
    <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>


Cheers
Mike Kneller
ukchill mac com
http://www.mikekneller.com

_______________________________________________
xml mailing list, project page  http://xmlsoft.org/ xml gnome org 
http://mail.gnome.org/mailman/listinfo/xml


_______________________________________________
xml mailing list, project page  http://xmlsoft.org/ 
xml gnome org http://mail.gnome.org/mailman/listinfo/xml




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]