使用动态标记名称转换列表

时间:2014-01-23 19:10:24

标签: xml xslt

我必须转换以下xml片段

   <district>
     <name>SOUTH</name>
     <geoCode>18277</geoCode>    
    </district>    
    <district>
     <name>NORTH</name>
     <geoCode>333</geoCode>    
    </district>

进入

<entity id="district">
   <instance id="1">
     <property name="name">SOUTH</property>
     <property name="geoCode">18277</property>
   </instance>
   <instance id="2">
     <property name="name">NORTH</property>
     <property name="geoCode">333</property>
   </instance>
</entity>

换句话说,我的源xml包含实体列表;结果应该有一个实体组标签,其@id等于列表标签名称,在这个组中我需要构建与原始列表实体对应的实例列表。 是否可以使用xsl?

1 个答案:

答案 0 :(得分:0)

您可以从身份模板开始,然后根据需要操作的特定元素进行操作。即,将positionlocal-name放入您正在创建的新元素中。

所以你可以使用这个XML(添加root来使其形成良好)。

<root>
  <district>
    <name>SOUTH</name>
    <geoCode>18277</geoCode>    
  </district>    
  <district>
    <name>NORTH</name>
    <geoCode>333</geoCode>    
  </district>
</root>

并针对此XSLT运行它:

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

<xsl:template match="root">
  <entity id="district">
    <xsl:apply-templates/>
  </entity>
</xsl:template>

<xsl:template match="district">
  <instance id="{position()}">
    <xsl:apply-templates/>
  </instance>
</xsl:template>

<xsl:template match="name | geoCode">
  <property name="{local-name()}">
    <xsl:value-of select="."/>
  </property>
</xsl:template>

生成输出。

如果您需要最后一个模板更通用,可以将匹配更改为

<xsl:template match="district/*">

哪个会对district的所有子元素执行操作,将它们转换为新的property元素。