Как назначить объявленные поля элементам / записям в XML, чтобы экспортировать их в простой файл CSV
Ручная замена элементов / записей @id на поле @name выполняет свою работу, но я ищу XSLT, который помог бы мне автоматически воспроизвести изменения
Исходный образец XML
<table id = "1A" name = "TableName" comment = "">
<fields>
<field id = "field1" name = "name_of_field1" other_uselessatr = "..."/>
<field id = "field2" name = "name_of_field2" other_uselessatr = "..."/>
<field id = "field3" name = "name_of_field3" other_uselessatr = "..."/>
</fields>
<records count = "200">
<rec num = "1">
<fld id = "field1">value1</fld>
<fld id = "field3">value2</fld>
<fld id = "field2">value3</fld>
</rec>
<rec num = "..."></rec>
</records>
</table>
Желаемый результат
<rec id = "1">
<name_of_field1>value1</name_of_field1>
<name_of_field2>value2</name_of_field2>
<name_of_field3>value3</name_of_field3>
</rec>
...





Вы можете использовать ключ:
<xsl:key name = "field-ref" match = "fields/field" use = "@id"/>
<xsl:template match = "fld">
<xsl:element name = "{key('field-ref', @id)/@name}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
Пример XSLT 3 в https://xsltfiddle.liberty-development.net/ncdD7kP, но ключ должен работать так же со старыми версиями XSLT, вам нужно будет указать преобразование идентичности вместо использования xsl:mode или, возможно, вы захотите добавить больше шаблонов для выполнения других изменений, например
<xsl:template match = "rec/@num">
<xsl:attribute name = "id" select = "."/>
</xsl:template>
как сделано в https://xsltfiddle.liberty-development.net/ncdD7kP/1
@kretinus Обратите внимание, что здесь предполагается, что ваши имена полей являются допустимыми именами элементов XML. Это может быть, а может и не всегда быть правдой. Формат, который вы показываете в качестве входных данных, - это тот тип формата, в котором базы данных часто используют так как, они не могут гарантировать, что их имена полей может будут использоваться в качестве имен элементов XML. Имейте в виду.
Используйте ключ: w3.org/TR/1999/REC-xslt-19991116#key