преобразование XML с помощью XSLT дает неверный результат - PullRequest
0 голосов
/ 29 января 2019

Я хочу преобразовать двухэлементный XML в двухстрочный HTML-код.

 <div id='name'>donald</div>

Почему ??

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Это, вероятно, потому, что результатом вашего преобразования является не правильно сформированный XML (потому что у вас нет одного корневого элемента; у вас есть два div элемента).

Передача неправильно сформированного XML в tostring(), который ожидает элемент (единственное число) или дерево, кажется, является причиной того, что вы видите только первый элемент результата.

Если вы переносите divs в одном элементе (например, 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 s (без изменений в XSLT).

0 голосов
/ 29 января 2019

Я не совсем понимаю причину, но как насчет этого

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>
...