2015-07-08 4 views
0

Исходя из моего предыдущего вопроса (how to transform XML?), у меня теперь есть хорошо структурированный XML-документ, как это ..Как преобразовать XML в текст

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
<employee id="1" reportsTo="1" title="CEO"> 
    <employee id="2" reportsTo="1" title="Director of Operations"> 
     <employee id="3" reportsTo="2" title="Human Resources Manager" /> 
    </employee> 
</employee> 
</root> 

Теперь мне нужно, чтобы преобразовать его в JavaScript, как это. .

var treeData = [ 
{ 
"name": "CEO", 
"parent": "null", 
"children": [ 
    { 
    "name": "Director of Operations", 
    "parent": "Top Level", 
    "children": [ 
     { 
     "name": "Human Resources Manager", 
     "parent": "Level 2: A" 
     } 
    ] 
    } 
] 
} 
]; 

Я начал писать XSLT, которая в настоящее время выглядит следующим образом ..

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
<xsl:output method="text" omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="root"> 
    <xsl:apply-templates select="employee" /> 
</xsl:template> 

<xsl:template match="employee"> 
    <xsl:param name="eId" select="@id" /> 
    <xsl:param name="eReports" select="@reportsTo" /> 
    <xsl:param name="eTitle" select="@title" /> 
    <xsl:value-of select="concat($eTitle, ' and ', $eId)" />  
    <xsl:apply-templates select="employee" /> 
</xsl:template> 

</xsl:stylesheet> 

Но когда я применяю преобразование (через библиотеку lxml pythons), я получаю сообщение «Нет». (В случае, если это помогает, вот команда LXML я использую ...)

dom = ET.parse("input.xml") 
xslt = ET.parse("transform.xslt") 
transform = ET.XSLT(xslt) 
newdom = transform(dom) 
print(ET.tostring(newdom, pretty_print=True)) 

Я знаю, что мой XSLT далеко не полный, но почему я не получаю любой выход? Должен ли я, по крайней мере, печатать титул на работу?

+0

«* почему я не получаю никакого вывода * «Ваша проблема не может быть воспроизведена с помощью кода, который вы опубликовали. –

+0

Результат с использованием вашего текущего кода: «CEO» и «1Director of Operations» и «2Human Resources Manager» и «3». –

+0

Спасибо @ michael.hor257k Я нахожусь «Нет» на своей машине. Я думаю, что моя проблема может быть связана с тем, как я использую преобразование в lxml. –

ответ

1

Редактировать: теперь обновлено, что в OP включен его код Python.

Ваша проблема заключается в том, что lxml.etree.tostring, а также метод .write имеет смысл только на XML, а не на результате XSLT с output method="text", которые не могут иметь один корневой элемент XML, как делает. По какой-то непонятной причине функции do имеют аргумент ключевого слова method=, но он ничего полезного не делает.

Это то, что вы должны сделать:

import lxml.etree as etree 
data = etree.parse('data.xml') 
transform = etree.XSLT(etree.parse('txt.xslt')) 
res = transform(data) 
bytes(res) 
b'\nCEO and 1Director of Operations and 2Human Resources Manager and 3\n' 

Если вы заинтересованы в реальном мире, например, I recently made a patch.

+0

Извините. Я редактировал свой код перед публикацией. Изменит вопрос с дополнительными параметрами в функции concat. –

+0

@LucienStals обновлено, все еще не 'Нет'. Вы действительно должны были включить свой код на Python. – o11c

+0

@LucienStals и ответ обновлен тоже – o11c

Смежные вопросы