2017-02-24 94 views
1

我是xslt的新手,我正在從事xml到xml的轉換工作。請爲下面的問題提供一個xslt解決方案。 輸入XML是如下:使用xslt將XML轉換爲XML,使用屬性名稱替換元素名稱

<root type="object"> 
    <items type="array"> 
     <item type="object"> 
      <original_file_name type="string">filename-m.mp3</original_file_name> 
      <description type="string">some description text</description> 
      <created_at type="string">2017-02-20T20:52:52Z</created_at> 
      <metadata type="object"> 
       <guest type="string">guestname here</guest> 
       <webInfo type="string">http://abc</webInfo> 
       <title type="string">title text testing</title> 
       <airDate type="string">2017-02-21</airDate> 
      </metadata> 
      <status type="string">live</status> 
      <asset_type type="string">video</asset_type> 
      <player_id type="string">391e099a718f4a62b44c78f97f85ecde</player_id> 
      <name type="string">title</name> 
     </item> 
     <item type="object"> 
      <original_file_name type="string">filename-m.mp3111</original_file_name> 
      <description type="string">some description text test</description> 
      <created_at type="string">2015-02-20T20:52:52Z</created_at> 
      <metadata type="object"> 
       <guest type="string">guestname here 1111</guest> 
       <webInfo type="string">http://abc</webInfo> 
       <a:item type="string" item="album description" xmlns:a="item">test description album</a:item> 
       <a:item type="string" item="album order" xmlns:a="item">106</a:item> 
      </metadata> 
      <status type="string">live</status> 
      <asset_type type="string">video</asset_type> 
      <player_id type="string">391e099a718f4a62b44c78f97f85ecdea</player_id> 
      <name type="string">title1</name>   
     </item> 
    </items> 
</root> 

輸出XML需要是如下:

<assets> 
    <item> 
     <original_file_name>filename-m.mp3</original_file_name> 
     <description>some description text</description> 
     <created_at>2017-02-20T20:52:52Z</created_at> 
     <guest>guestname here</guest> 
     <webInfo>http://abc</webInfo> 
     <title>title text testing</title> 
     <airDate>2017-02-21</airDate> 
     <status type="string">live</status> 
     <asset_type type="string">video</asset_type> 
     <player_id type="string">391e099a718f4a62b44c78f97f85ecde</player_id> 
     <name type="string">title</name> 
    </item> 
    <item> 
     <original_file_name>filename-m.mp3111</original_file_name> 
     <description>some description text test</description> 
     <created_at>2015-02-20T20:52:52Z</created_at> 
     <guest>guestname here 1111</guest> 
     <webInfo>http://abc</webInfo> 
     <album_description>test description album</album_description> 
     <album_order>106</album_order> 
     <status type="string">live</status> 
     <asset_type type="string">video</asset_type> 
     <player_id type="string">391e099a718f4a62b44c78f97f85ecdea</player_id> 
     <name type="string">title1</name> 
    </item> 
</assets> 

子元數據的節點被動態元素,元素名稱和編號將在每個子節點不同的元數據。 下面是輸出文件的更改:

  1. 替換資產根/項目
  2. 刪除元數據的元數據標籤和子節點成爲項目的直接孩子
  3. 當元數據的子節點有: item元素然後用屬性item =「album description」替換元素名稱 屬性值有空格,所以我們需要用下劃線替換空格。

我需要有點數的解決方案3.

謝謝

回答

0
<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:a="item"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- replace root/items with assets --> 
<xsl:template match="root/items"> 
    <xsl:element name="assets"> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

<!-- for some elements, copy only inner nodes, not attributes --> 
<xsl:template match="item|original_file_name|description|created_at|guest|webInfo|title|airDate"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 

<!-- for metadata tag replace it with its children --> 
<xsl:template match="metadata">  
    <xsl:apply-templates select="node()"/> 
</xsl:template> 

<!-- for a:item tag emit new element with name taken from item attribute --> 
<xsl:template match="a:item">  
    <xsl:element name="{translate(@item, ' ', '_')}"> 
    <xsl:apply-templates select="node()"/> 
    </xsl:element> 
</xsl:template> 

<!--Identity template, provides default behavior that copies all content into the output --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

我得到一個錯誤消息」‘:’字符,十六進制值0x3A,不能包含在名稱「在行

+0

它取決於您正在使用的xslt處理器。我在xalan和撒克遜人測試了它,它對兩者都有效。 – Lesiak

+0

我在SSIS(Microsoft visual studio 2010)中使用XML任務。我不知道如何驗證xslt處理器 –

相關問題