Orcl User
Orcl User

Reputation: 293

Filtering xml: XSLT with lxml in python

fTrying to filter the xml input with XSLT, I have problem running the following code. I think there is a problem with the defined XSLT..I would like to define a rule in XSLT to discard 'Foo' element in the input xml. This is how my code looks like:

from lxml import etree
from io import StringIO

def testFilter():

  xslt_root = etree.XML('''\
  <xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

  <xsl:template match="Foo"/>

  </xsl:stylesheet>
  ''')

  transform = etree.XSLT(xslt_root)

  f = StringIO(unicode('<?xml version="1.0"?><ComponentData><DataSet name="one">  <Foo fooValue="2014"/></DataSet><DataSet   name="two"><Foo fooValue="2015"/></DataSet></ComponentData>
  ')) 

  doc = etree.parse(f)
  result_tree = transform(doc)

  print(str(result_tree))  

if __name__=='__main__':
  testFilter()

Upvotes: 0

Views: 276

Answers (1)

sk11
sk11

Reputation: 1824

What you are missing is the correct template-match.

Modified code:

from lxml import etree
from io import StringIO

def testFilter():
  xslt_root = etree.XML('''\
  <xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

  <xsl:template match="TimeStamp"/>

  </xsl:stylesheet>
  ''')

  transform = etree.XSLT(xslt_root)

  f = StringIO(unicode('<?xml version="1.0"?><ComponentData><DataSet name="one">  <TimeStamp timeStampValue="2014"/></DataSet><DataSet name="two"><TimeStamp timeStampValue="2015"/></DataSet></ComponentData>')) 
  doc = etree.parse(f)
  result_tree = transform(doc)

  print(str(result_tree))  

if __name__=='__main__':
  testFilter()

This outputs:

<?xml version="1.0"?>
<ComponentData><DataSet name="one">  </DataSet><DataSet name="two"/></ComponentData>

Upvotes: 1

Related Questions