使用XSLT将XML属性转换为元素

时间:2016-12-05 20:42:29

标签: xslt

我有以下XML,元素是动态生成的,可以不时更改,因此我不能硬编码字段名,

 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
   <datacollection id="amazon_order.1">
   <table name="order_detail">
       <row name="default_options">
           <field name="zipCode">800227028</field>
           <field name="customerLastName">COMER</field>
           <field name="state">CO</field>
           <field name="city">COMMERCE CITY</field>
           <field name="serialNumber">818243CX601252Y</field>           
       </row>
     </table>
     </datacollection>

并希望使用XSLT将其转换为以下格式,

<datacollection id="amazon_order.1">
<table name="order_detail">
   <row name="default_options">
       <zipCode>800227028</zipCode>
       <customerLastName>COMER</customerLastName>
       <state>CO</state>
       <city>COMMERCE CITY</city>
       <serialNumber>818243CX601252Y</serialNumber>                      
   </row>
</table>
</datacollection>

1 个答案:

答案 0 :(得分:2)

您希望将<field>元素转换为具有从原始元素属性派生的变量名称的输出元素。这需要一个匹配原始元素的模板,并通过XSL element元素创建相应的新元素。您希望保持其他所有内容相同,以便调用标识转换来处理以前<field>元素外部和内部的所有其他内容。

假设您的<field>元素永远不会有name以外的属性需要转移到结果文档,那将是这样的:

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

  <!-- identity transform for otherwise-unmatched nodes and attributes -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <!-- transform for field elements at any depth -->
  <xsl:template match="field">
    <xsl:element name="{@name}">
      <!-- transform this node's non-attribute children -->
      <xsl:apply-templates select="node()" />
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>