我必须转换以下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?
答案 0 :(得分:0)
您可以从身份模板开始,然后根据需要操作的特定元素进行操作。即,将position
和local-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
元素。