XML структура в другую XML структуру с использованием XSLT - PullRequest
0 голосов
/ 21 февраля 2020

Я очень новичок в XSLT и застрял на проблеме надолго. Структура этого XML документа меня бросает, и я не знаю, как go о его реструктуризации.

Пример XML приведен ниже.

<?xml version="1.0" encoding="utf-16"?>
<data>
	<source>192.***.**.**</source>
<device>
	<Id>1234</Id>
</device>
<update>
	<time>20141014T060927.557+0000</time>
	<field>
		<id>1</id>
		<dtype>float</dtype>
		<value>-31.917587</value>
	</field>
	<field>
		<id>2</id>
		<dtype>float</dtype>
		<value>115.806841</value>
	</field>
	<field>
		<id>3</id>
		<dtype>int</dtype>
		<value>3</value>
	</field>
	<field>
		<id>4</id>
		<dtype>int</dtype>
		<value>1</value>
	</field>
</update>
</data>

В этой структуре элемент id фактически является именем поля, в то время как dtype является типом данных поля. Значение - это значение.

Требуемая структура:

<?xml version="1.0" encoding="utf-16"?>
<data>
    <source>192.168.20.21</source>
    <device>
        <Id>1234</Id>
    </device>
    <update>
        <field>
            <column1>-31.917587</column1>
            <column2>115.806841</column2>
            <column3>3</column3>
            <column4>1</column4>
            <time>20141014T060927.557+0000</time>
        </field>
    </update>
</data>

Я понимаю, что XSLT - единственный способ go об этом, но я не разработал, как лучше построить таблицу стилей, которая выведет меня из существующей структуры в желаемый.

Некоторая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 21 февраля 2020

Попробуйте это:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output indent="yes"/>

  <xsl:template match="node()|@*">
      <xsl:copy>
          <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
  </xsl:template>    

  <xsl:template match="update">
    <xsl:for-each select="field">
        <xsl:element name="column{position()}">
            <xsl:value-of select="value"/>
        </xsl:element>
    </xsl:for-each>        
    <xsl:apply-templates select="time"/>
  </xsl:template>

</xsl:stylesheet>

См. Преобразование в https://xsltfiddle.liberty-development.net/bwe3ce

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