Еще раз проблема. У меня не очень хороший xml. Например следующее:Рекурсивная трансформация XSLT
<?xml version="1.0" encoding="UTF-8"?>
<Values>
<record name='svc_sig'>
<record name="sig_in">
<array depth="1" name="rec_fields" type="record">
<record>
<!-- Some irrelevant metadata information with value node name... -->
<value name="field_name">docTest</value>
<value name="field_type">record</value>
<value name="field_dim">0</value>
<array depth="1" name="rec_fields" type="record">
<record javaclass="com.wm.util.Values">
<!-- Some irrelevant metadata information with value node name... -->
<value name="field_name">doc.name</value>
<value name="field_type">string</value>
<value name="field_dim">0</value>
</record>
</array>
</record>
<record>
<value name="field_name">docListTest</value>
<value name="field_type">record</value>
<value name="field_dim">1</value>
<array depth="1" name="rec_fields" type="record">
<record>
<value name="field_name">d0</value>
<value name="field_type">record</value>
<value name="field_dim">0</value>
<array depth="1" name="rec_fields" type="record">
<record>
<value name="field_name">d0.name</value>
<value name="field_type">string</value>
<value name="field_dim">0</value>
</record>
</array>
</record>
</array>
</record>
<record>
<value name="field_name">packages_should_work</value>
<value name="field_type">recref</value>
<value name="field_dim">0</value>
<value name="rec_ref">data:packages</value>
</record>
<record>
<value name="field_name">packages_list_should_work</value>
<value name="field_type">recref</value>
<value name="field_dim">1</value>
<value name="rec_ref">data:packages</value>
</record>
</array>
</record>
</record>
</Values>
Для простоты мне нужно сопоставить этот XML к Java класса, который уже дал, и я не могу изменить его. Имея это в виду, я должен преобразовать этот xml в другой со значимыми именами. Например:
<sig_in>
<record>
<field_name>docTest</field_name>
<field_type>record</field_type>
<field_dim>0</field_dim>
</record>
<record>
<field_name>docListTest</field_name>
<field_type>record</field_type>
<field_dim>1</field_dim>
</record>
<record>
<field_name>packages_should_work</field_name>
<field_type>recref</field_type>
<field_dim>0</field_dim>
</record>
<record>
<field_name>packages_list_should_work</field_name>
<field_type>recref</field_type>
<field_dim>1</field_dim>
</record>
</sig_in>
До сих пор я создал что-то вроде этого:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" encoding="UTF-8" />
<xsl:template match="/" name="service_signature">
<sig_in>
<xsl:for-each select="Values/record[@name='svc_sig']/record[@name='sig_in']/array[@name]/record">
<record>
<field_name><xsl:value-of select="value[@name='field_name']/text()"/></field_name>
<field_type><xsl:value-of select="value[@name='field_type']/text()"/></field_type>
<field_dim><xsl:value-of select="value[@name='field_dim']/text()"/></field_dim>
</record>
</xsl:for-each>
</sig_in>
</xsl:template>
</xsl:stylesheet>
В то время как он работает для основных элементов не будет работать для вложенных записей. Я мог бы создать xsl: for-each и перебрать каждый элемент, если тип является записью, но это не решит многое; потому что он может быть любым глубоким. Я знаю, что я должен использовать рекурсию, я просто не могу представить, как я могу это сделать в этом конкретном случае.
@Edit - Некоторые исправления для вложенных типов:
<record>
<field_name>docListTree</field_name>
<field_type>record</field_type>
<field_dim>1</field_dim>
<record>
<field_name>d0</field_name>
<field_type>record</field_type>
<field_dim>0</field_dim>
<record>
<field_name>d0.name</field_name>
<field_type>string</field_type>
<field_dim>0</field_dim>
</record>
</record>
</record>
Так как вы можете увидеть, где исходный тип вложен мне нужно то же самое в результате XML также. Или в квартире мне нужен какой-то уникальный идентификатор в родительских и дочерних узлах, поэтому я знаю, что содержит. В любом случае я не должен потерять структуру.
@Edit: - Очень жаль, что я хотел сэкономить место, и мне не удалось показать сложность за стенами. Таким образом, каждая запись содержит узлы имен значений. Большинство из них содержат только бесполезную метаданные, которые мне не нужны. Также есть две записи: @name {sig_in, sig_out}, из которых мне нужно только sig_in, с информацией field_name, field_type, field_dim, вместе с вложенными записями. Я просмотрю все рекомендованные параметры и попытаюсь изменить их в соответствии с потребностями.
Благодарим за любую помощь! - Джо
только, чтобы это ясно. Выход должен содержать любые записи из ввода без учета каких-либо условий? –
Структура должна оставаться неизменной. Если запись вложена в другую, она также должна быть вложена в полученный xml. – Wrath