可行
我必须转换以下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吗?
您可以从身份模板开始,然后对需要操作的特定元素作用。即,将position
和local-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
元素。