python中使用lxml过滤xml:XSLT

python中使用lxml过滤xml:XSLT,python,xml,xslt,lxml,Python,Xml,Xslt,Lxml,尝试使用XSLT过滤xml输入时,我在运行以下代码时遇到问题。我认为定义的XSLT有问题。我想在XSLT中定义一个规则,以丢弃输入xml中的“Foo”元素。我的代码是这样的: 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/

尝试使用XSLT过滤xml输入时,我在运行以下代码时遇到问题。我认为定义的XSLT有问题。我想在XSLT中定义一个规则,以丢弃输入xml中的“Foo”元素。我的代码是这样的:

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()
从lxml导入etree
从io导入StringIO
def testFilter():
xslt_root=etree.XML(“”)\
''')
transform=etree.XSLT(XSLT\u根)
f=StringIO(unicode('
')) 
doc=etree.parse(f)
结果树=转换(文档)
打印(str(结果树))
如果“名称”=“\uuuuuuuu主要”:
testFilter()

您缺少的是正确的
模板匹配

修改代码:

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()
从lxml导入etree
从io导入StringIO
def testFilter():
xslt_root=etree.XML(“”)\
''')
transform=etree.XSLT(XSLT\u根)
f=StringIO(unicode(“”))
doc=etree.parse(f)
结果树=转换(文档)
打印(str(结果树))
如果“名称”=“\uuuuuuuu主要”:
testFilter()
此输出:

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


为什么您将时间戳从
更改为
Foo
?不管怎样,这个想法还是一样的,检查我下面的答案。它只是一个名字,可以是任何东西,这并不重要。谢谢,如果你能解释一下你是如何定义规则的,那就太好了,实际上我需要对我的xml文件做更多的修改,比如只删除元素标记中的一个属性或者删除一块标记。检查一下,它包含了很多关于使用xslt的有用信息。