我是 lxml 和 xslt 的新手,并尝试执行以下操作 - 这是我的 xml:
<root>
<header>
<h1>foo</h1>
</header>
<product>
<a>something1</a>
<b>something2</b>
</product>
<product>
<a>something3</a>
<b>something4</b>
</product>
</root>
使用 lxml XSLT 类,我想检查每个产品元素,然后对其应用一些规则,例如:
def example():
example_xml = '''\
<root>
<header><h1>foo</h1></header>
<product><a>something1</a><b>something2</b></product>
<product><a>something3</a><b>something4</b></product>
</root>'''
xslt_xml = etree.XML('''\
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:template match="/">
<foo><xsl:value-of select="a" /></foo>
</xsl:template>
</xsl:stylesheet>
''')
transform = etree.XSLT(xslt_xml)
doc = etree.parse(StringIO(example_xml))
root = doc.getroot()
for product in root.iterfind('product'):
result = transform(product)
print result
这个例子没有找到,只有当我将 xslt_xml 中的“match”属性更改为 match="product" 时才有效。我认为 match="/" 意味着匹配根,所以我不确定为什么这不起作用。
我更大的问题是我还想获取有关产品祖先或父母元素的信息,但这不起作用,即这个 xslt 不返回任何内容:
xslt_xml = etree.XML('''\
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:template match="product">
<foo><xsl:value-of select="../header/h1" /></foo>
</xsl:template>
</xsl:stylesheet>
''')
所以在示例代码中:
for product in root.iterfind('product'):
print product.xpath('../header/h1/text()') #works
result = transform(product)
print result #doesn't work
如果我在产品上运行 xslt 转换,是否可以访问这些元素?我不想在整个文档上运行 xslt,我想检查每个产品元素并处理它,我知道我可以使用 xslt 完成“针对每个产品”循环,但我不希望那样,此循环在 xslt 处理之外。
任何帮助将不胜感激,谢谢!