将嵌套的XML属性展平为元素

时间:2018-02-12 17:32:30

标签: xml xslt

我需要创建一个XSLT文件,将我的XML从属性丰富转换为基于元素,然后将其加载到Access数据库中,但我很难看到如何组合嵌套元素中的属性。
任何帮助将不胜感激。

当前数据:

<device id="11281">
    <mv t="COS_PHI" v="0.999"/>
    <mv t="ERROR"/>
    <mv t="E_DAY" v="104010"/>
    -<mv t="I_AC">
        <sv t="1" v="41.9935"/>
        <sv t="2" v="41.8"/>
        <sv t="3" v="41.929"/>
    </mv>
    -<mv t="I_DC">
        <sv t="1" v="12.9839"/>
        <sv t="2" v="12.7774"/>
        <sv t="3" v="12.6258"/>
        <sv t="4" v="6.69032"/>
    </mv>
</device>

所需格式:

<device>
    <id>11281</id>
    <COS_PHI>0.999</COS_PHI>
    <ERROR></ERROR>
    <E_DAY>104010</E-DAY>
    <I_AC_1>41.9935</I_AC_1>
    <I_AC_2>41.8</I_AC_2>
    <I_AC_3>41.929</I_AC_3>
    <I_DC_1>12.9839</I_DC_1>
    <I_DC_2>12.7774</I_DC_2>
    <I_DC_3>12.6258</I_DC_3>
    <I_DC_4>6.69032</I_DC_4>
</device>

1 个答案:

答案 0 :(得分:0)

以下XSLT-1.0文件将完成这项工作:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
  <xsl:template match="text()" />             <!-- removes all free text() nodes -->

  <xsl:template match="mv[not(child::*)]">    <!-- transforms all <mv> elements without children -->
    <xsl:element name="{@t}">
      <xsl:value-of select="@v" />
    </xsl:element>
    <xsl:apply-templates select="sv" />       <!-- visits sub-nodes -->
  </xsl:template> 

  <xsl:template match="sv">                   <!-- creates elements with 'mv' parents -->
    <xsl:element name="{concat(../@t,'_',@t)}">
      <xsl:value-of select="@v" />
    </xsl:element>
  </xsl:template>   

  <xsl:template match="@id">                  <!-- handles 'id' attribute of root element -->
    <xsl:element name="id">
      <xsl:value-of select="." />
    </xsl:element>
  </xsl:template> 

  <xsl:template match="/device">              <!-- initiates process from root elements -->
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>