2013-02-15 54 views
0

我有一個xml和Map對象,map包含一些關於xml節點的附加信息ie。循環映射對象並使用xsl變換修改xml

<searchPersonResponse> 
<persons> 
    <person> 
    <id>123</id> 
    </person> 
    <person> 
    <id>456</id> 
    </person> 
    </persons> 
</searchPersonResponse> 

,我的地圖是一樣的東西這個 -

infoMap<123, <name="abc"><age="25">> 
infoMap<456, <name="xyz"><age="80">> 

和我想要的輸出中是這樣的: -

<searchPersonResponse> 
<persons> 
    <person> 
    <id>123</id> 
    <name>abc</name> 
    <age>25</age> 
    </person> 
    <person> 
    <id>456</id> 
    <name>xyz</name> 
    <age>80</age> 
    </person> 
</persons> 
</searchPersonResponse> 

我搜索了很多FOT這種eample /樣品,但沒有找到類似的。請幫忙 !!在此先感謝

+0

凡地圖從何而來?它存儲爲一個字符串?可以改成XML嗎? – 2013-02-17 16:06:40

+0

xml來自'sql query'或'object deserialization',而map來自另一個業務調用。它cab也改爲xml。 – amarzeet 2013-02-18 06:52:41

+0

那麼,可以將地圖(XML格式)和XML放在同一個文件中? – 2013-02-18 14:18:55

回答

0

因爲您可以將所有內容放在同一個XML文件中,所以您可以構建包含地圖信息和數據的以下XML文件。

<xml> 
    <!-- Original XML --> 
    <searchPersonResponse> 
     <persons> 
      <person> 
       <id>123</id> 
      </person> 
      <person> 
       <id>456</id> 
      </person> 
     </persons> 
    </searchPersonResponse> 
    <!-- Map definition --> 
    <map> 
     <value id="123"> 
      <name>abc</name> 
      <age>25</age> 
     </value> 
     <value id="456"> 
      <name>xyz</name> 
      <age>80</age> 
     </value> 
    </map> 
</xml> 

現在你可以使用這個樣式表將XML文件轉換爲所需的輸出:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes"/> 

    <!-- Identity template : copy all elements and attributes by default --> 
    <xsl:template match="*|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="*|@*" /> 
     </xsl:copy> 
    </xsl:template> 

    <!-- Avoid copying the root element --> 
    <xsl:template match="xml"> 
     <xsl:apply-templates select="searchPersonResponse" /> 
    </xsl:template> 

    <xsl:template match="person"> 
     <!-- Copy the person node --> 
     <xsl:copy> 
      <!-- Save id into a variable to avoid losing the reference --> 
      <xsl:variable name="id" select="id" /> 
      <!-- Copy attributes and children from the person element and the elements from the map--> 
      <xsl:copy-of select="@*|*|/xml/map/value[@id = $id]/*" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet>