【问题标题】:Filtering xml: XSLT with lxml in python过滤 xml:在 python 中使用 lxml 的 XSLT
【发布时间】:2014-08-07 15:18:49
【问题描述】:

f尝试使用 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()

【问题讨论】:

  • 你为什么从TimeStamp变成Foo?无论如何,想法保持不变,请在下面查看我的答案。
  • 只是一个名字,可以是任何东西,没关系。

标签: python xml xslt lxml


【解决方案1】:

您缺少的是正确的template-match

修改代码:

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()

这个输出:

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

【讨论】:

  • 谢谢,如果您能解释一下您是如何定义规则的,那就太好了,实际上我需要对我的 xml 文件进行更多修改,例如仅删除元素标记中的属性或删除块标签。
  • 检查这个page 它包含很多关于使用 xslt 的有用信息。
猜你喜欢
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多