使用 XSLT 转换 XML 给出了错误的结果
transforming XML with XSLT gives a wrong result
我想将两项 XML 转换为两行 HTML
from lxml import etree
xroot = etree.XML(b'''<?xml version="1.0" encoding="utf-8"?>
<xml>
<name>donald</name>
<surname>trump</surname>
</xml>
''')
xml=etree.ElementTree(xroot)
xslt_root = etree.XML('''
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="xml">
<div id='name'><xsl:value-of select="name" /></div>
<div id='surname'><xsl:value-of select="surname" /></div>
</xsl:template>
</xsl:stylesheet>''')
transform = etree.XSLT(xslt_root)
transform=etree.XSLT(xslt_root)
html=etree.tostring(transform(xml)).decode('utf-8')
print(html)
我期望的结果是:
<div id='name'>donald</div>
<div id='surname'>trump</div>
但我得到的结果是:
<div id='name'>donald</div>
为什么?
我不是很清楚原因,但是这样做怎么样
from lxml import etree
xroot = etree.XML(b'''<?xml version="1.0" encoding="utf-8"?>
<xml>
<name>donald</name>
<surname>trump</surname>
</xml>
''')
xml = etree.ElementTree(xroot)
xslt_root = etree.XML('''
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="xml">
<div id='name'><xsl:value-of select="name" /></div>
<div id='surname'><xsl:value-of select="surname" /></div>
</xsl:template>
</xsl:stylesheet>''')
# transform = etree.XSLT(xslt_root)
transform = etree.XSLT(xslt_root)
# html = etree.tostring(transform(xml)).decode('utf-8')
# print(html)
print(str(transform(xml)).split('\n'))
# ['<?xml version="1.0"?>', '<div id="name">donald</div><div id="surname">trump</div>', '']
# the element at index 1 contains <div id="name">donald</div><div id="surname">trump</div>
这可能是因为您的转换结果不是 well-formed XML(因为您没有单个根元素;您有两个 div
元素)。
将格式不正确的 XML 传递给需要元素(单数)或树的 tostring()
,这似乎是您只看到第一个结果元素的原因。
如果将 div
包裹在单个元素中(如 test
),您将看到两个 div
s...
from lxml import etree
xroot = etree.XML(b'''<?xml version="1.0" encoding="utf-8"?>
<xml>
<name>donald</name>
<surname>trump</surname>
</xml>
''')
xml = etree.ElementTree(xroot)
xslt_root = etree.XML('''
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="xml">
<test>
<div id='name'><xsl:value-of select="name" /></div>
<div id='surname'><xsl:value-of select="surname" /></div>
</test>
</xsl:template>
</xsl:stylesheet>''')
transform = etree.XSLT(xslt_root)
html = etree.tostring(transform(xml)).decode('utf-8')
print(html)
打印输出...
<test><div id="name">donald</div><div id="surname">trump</div></test>
仅打印转换结果 (print(transform(xml))
) 也会显示两个 div
(没有对 XSLT 进行更改)。
我想将两项 XML 转换为两行 HTML
from lxml import etree
xroot = etree.XML(b'''<?xml version="1.0" encoding="utf-8"?>
<xml>
<name>donald</name>
<surname>trump</surname>
</xml>
''')
xml=etree.ElementTree(xroot)
xslt_root = etree.XML('''
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="xml">
<div id='name'><xsl:value-of select="name" /></div>
<div id='surname'><xsl:value-of select="surname" /></div>
</xsl:template>
</xsl:stylesheet>''')
transform = etree.XSLT(xslt_root)
transform=etree.XSLT(xslt_root)
html=etree.tostring(transform(xml)).decode('utf-8')
print(html)
我期望的结果是:
<div id='name'>donald</div>
<div id='surname'>trump</div>
但我得到的结果是:
<div id='name'>donald</div>
为什么?
我不是很清楚原因,但是这样做怎么样
from lxml import etree
xroot = etree.XML(b'''<?xml version="1.0" encoding="utf-8"?>
<xml>
<name>donald</name>
<surname>trump</surname>
</xml>
''')
xml = etree.ElementTree(xroot)
xslt_root = etree.XML('''
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="xml">
<div id='name'><xsl:value-of select="name" /></div>
<div id='surname'><xsl:value-of select="surname" /></div>
</xsl:template>
</xsl:stylesheet>''')
# transform = etree.XSLT(xslt_root)
transform = etree.XSLT(xslt_root)
# html = etree.tostring(transform(xml)).decode('utf-8')
# print(html)
print(str(transform(xml)).split('\n'))
# ['<?xml version="1.0"?>', '<div id="name">donald</div><div id="surname">trump</div>', '']
# the element at index 1 contains <div id="name">donald</div><div id="surname">trump</div>
这可能是因为您的转换结果不是 well-formed XML(因为您没有单个根元素;您有两个 div
元素)。
将格式不正确的 XML 传递给需要元素(单数)或树的 tostring()
,这似乎是您只看到第一个结果元素的原因。
如果将 div
包裹在单个元素中(如 test
),您将看到两个 div
s...
from lxml import etree
xroot = etree.XML(b'''<?xml version="1.0" encoding="utf-8"?>
<xml>
<name>donald</name>
<surname>trump</surname>
</xml>
''')
xml = etree.ElementTree(xroot)
xslt_root = etree.XML('''
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="xml">
<test>
<div id='name'><xsl:value-of select="name" /></div>
<div id='surname'><xsl:value-of select="surname" /></div>
</test>
</xsl:template>
</xsl:stylesheet>''')
transform = etree.XSLT(xslt_root)
html = etree.tostring(transform(xml)).decode('utf-8')
print(html)
打印输出...
<test><div id="name">donald</div><div id="surname">trump</div></test>
仅打印转换结果 (print(transform(xml))
) 也会显示两个 div
(没有对 XSLT 进行更改)。