带有动态标签名称的变换列表



我必须转换以下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吗?

可行

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

因此,您可以采用此XML(添加了根以使其形成得当)。

<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元素。

最新更新