2013-09-26 3 views
0

Я пытаюсь написать XSLT-файл для следующего входного XML для вывода XML, возможно ли XSLT преобразовать значение ввода xml как узла в выходной XML? как я могу это реализовать?XML-значение для преобразования узлов XML с использованием XSLT?

Входной XML

<?xml version="1.0" encoding="UTF-8"?> 
<Rows> 
<Row><xml_data_name/> <xml_data_value/> </Row> 
<Row><xml_data_name>persons</xml_data_name> <xml_data_value/> </Row> 
<Row><xml_data_name>person</xml_data_name> <xml_data_value/> </Row> 
<Row><xml_data_name>username</xml_data_name> <xml_data_value>JS1</xml_data_value> </Row> 
<Row><xml_data_name>name</xml_data_name> <xml_data_value/> </Row> 
<Row><xml_data_name>name</xml_data_name> <xml_data_value>John</xml_data_value> </Row> 
<Row><xml_data_name>name</xml_data_name> <xml_data_value/> </Row> 
<Row><xml_data_name>family-name</xml_data_name> <xml_data_value/> </Row> 
<Row><xml_data_name>family-name</xml_data_name> <xml_data_value>Smith</xml_data_value> </Row> 
<Row><xml_data_name>family-name</xml_data_name> <xml_data_value/> </Row> 
<Row><xml_data_name>person</xml_data_name> <xml_data_value/> </Row> 
<Row><xml_data_name>person</xml_data_name> <xml_data_value/> </Row> 
<Row><xml_data_name>username</xml_data_name> <xml_data_value>MI1</xml_data_value> </Row> 
<Row><xml_data_name>name</xml_data_name> <xml_data_value/> </Row> 
<Row><xml_data_name>name</xml_data_name> <xml_data_value>Morka</xml_data_value> </Row> 
<Row><xml_data_name>name</xml_data_name> <xml_data_value/> </Row> 
<Row><xml_data_name>family-name</xml_data_name> <xml_data_value/> </Row> 
<Row><xml_data_name>family-name</xml_data_name> <xml_data_value>Ismincius</xml_data_value> </Row> 
<Row><xml_data_name>family-name</xml_data_name> <xml_data_value/> </Row> 
<Row><xml_data_name>person</xml_data_name> <xml_data_value/> </Row> 
<Row><xml_data_name>persons</xml_data_name> <xml_data_value/> </Row> 
<Row><xml_data_name/> <xml_data_value/> </Row> 
</Rows> 

Выходной XML

<?xml version="1.0" ?> 
<persons> 
    <person username="JS1"> 
    <name>John</name> 
    <family-name>Smith</family-name> 
    </person> 
    <person username="MI1"> 
    <name>Morka</name> 
    <family-name>Ismincius</family-name> 
    </person> 
</persons> 

ответ

1

Можно, конечно, использовать XSL: элемент, как

<xsl:template match="Row"> 
    <!-- Note {} brackets in name attribute --> 
    <xsl:element name="{xml_data_name}"> 
     <xsl:value-of select="xml_data_value" /> 
    </xsl:element> 
</xsl:template> 

Что будет большей проблемой является структура выходной becau se нелегко решить, какие строки должны быть вложенными, какие строки должны преобразовываться в атрибут, а не элемент и т. д.

0

Ну, это один из самых странных форматов данных, которые я когда-либо видел! Вы уверены, что не можете получить то, что произвело это, чтобы создать нечто более разумное?

Я думаю, что решение должно быть рекурсией: вам нужна функция, которая принимает последовательность строк в качестве входных данных; он выдает элемент, имя которого является именем первого элемента в последовательности без значения данных и содержимое которого получается рекурсивным вызовом, который передает все строки после этой первой строки до следующей строки без значения данных и с тем же именем , затем вызывает себя для обработки всех строк после этой строки. Нелегко и, конечно, занимает больше времени, чем я позволяю себе отвечать на вопросы SO!

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