2014-01-23 26 views
0

我不得不轉換列表與動態標籤名

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

變換下面的XML片段到

<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

您可以從身份模板開始,然後針對需要採取操作的特定元素採取行動。也就是說,將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元素。

+0

謝謝,它的工作原理!我可以與本地名稱的一部分進行比較嗎?在實際的XML消息中,我有幾個集合,以及諸如「asset_geoc0de」,「location_geocode」等標籤 – user3010912

+0

@ user3010912因此,您可能在''區域'元素下有其他元素?如果是這種情況,那麼您應該能夠更新該匹配適用於所有子元素,我將用一個示例更新問題,如果這是您正在尋找的內容。 –