Как назначить объявленные поля для записей XML - PullRequest
0 голосов
/ 09 января 2019

Как назначить объявленные поля для элементов / записей в 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>
...

1 Ответ

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

Вы можете использовать ключ:

  <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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...