使用 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),您将看到两个 divs...

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 进行更改)。