[lxml-dev] Using the Xpath id function

Floris Bruynooghe floris.bruynooghe at gmail.com
Wed Jul 2 11:34:49 CEST 2008


Hi

I've sent this to comp.lang.python a few days ago with no repsonse, so
I hope you don't mind if I try here (if there is a better place please
let me know)...

Basically I'm trying to use the .xpath('id("foo")') method on an lxml tree but
can't get it to work.

Given the following XML: <root><child id="foo"/></root>

And it's XMLSchema:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="child"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="child">
    <xs:complexType>
      <xs:attribute name="id" use="required" type="xs:ID"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

Or in more readable, compact RelaxNG, form:

element root {
   element child {
      attribute id { xsd:ID }
   }

}

Now I'm trying to parse the XML and use the .xpath() method to find
the <child/> element using the id XPath function:

from lxml import etree
schema_root = etree.parse(file('schema.xsd'))
schema = etree.XMLSchema(schema_root)
parser = etree.XMLParser(schema=schema)
root = etree.fromstring('<root><child id="foo"/></root>', parser)
root.xpath('id("foo")')  --> []

I was expecting to get the <child/> element with that last statement
(well, inside a list that is), but instead I just get an empty list.
Is there anything obvious I'm doing wrong?  As far as I can see the
lxml documentation says this should work.

Cheers
Floris

For completeness, `dpkg -l python-lxml' tells me I'm using Debian
lenny's lxml 2.0.6-1

-- 
Debian GNU/Linux -- The Power of Freedom
www.debian.org | www.gnu.org | www.kernel.org


More information about the lxml-dev mailing list