2017-03-20 66 views
0

我是xslt的新手,我正在從事xml到xml的轉換工作。請爲下面的問題提供一個xslt解決方案。 輸入XML是如下:元數據的xslt將唯一鍵與子節點關聯

<root type="object"> 
    <items type="array"> 
     <item type="object"> 
      <embed_code type="string">abcdef</embed_code> 
      <description type="string">some description text</description> 
      <created_at type="string">2017-02-20T20:52:52Z</created_at> 
      <metadata type="object"> 
       <guest type="string">Gary</guest> 
       <webinfo type="string">www.webinfotest.com</webInfo> 
       <title type="string">Practical Advice</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"> 
      <embed_code type="string">vwxyz</embed_code> 
      <description type="string">some description text test</description> 
      <created_at type="string">2015-02-20T20:52:52Z</created_at> 
      <metadata type="object"> 
       <scripture>Roman</scripture> 
       <theme>Obeying those in authority</theme> 
      </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> 

的子節點是動態的,元素的元素名稱和編號將在元數據中的每個子節點不同。 embed_code是具有唯一值的元素。 我需要有三個元素作爲項目1的子項。embed_code,2.metadata_name,3.metadata_value。 metadata_name元素將具有元數據子元素的元素名稱。 metadata_value元素將具有元數據子元素的值。

輸出XML需要如下爲:

<metadata> 
    <item> 
     <embed_code>abcdef</embed_code> 
     <metadata_name>guest</metadata_name> 
     <metadata_value>Gary</metadata_value> 
    </item> 
    <item> 
     <embed_code>abcdef</embed_code> 
     <metadata_name>webinfo</metadata_name> 
     <metadata_value>www.webinfotest.com</metadata_value> 
    </item> 
    <item> 
     <embed_code>abcdef</embed_code> 
     <metadata_name>title</metadata_name> 
     <metadata_value>Practical Advice</metadata_value> 
    </item> 
    <item> 
     <embed_code>abcdef</embed_code> 
     <metadata_name>airdate</metadata_name> 
     <metadata_value>2017-02-21</metadata_value> 
    </item> 
    <item> 
     <embed_code>vwxyz</embed_code> 
     <metadata_name>scripture</metadata_name> 
     <metadata_value>Roman</metadata_value> 
    </item> 
    <item> 
     <embed_code>vwxyz</embed_code> 
     <metadata_name>theme</metadata_name> 
     <metadata_value>Obeying those in authority</metadata_value> 
    </item> 
</metadata> 
+0

能否請您補充一點,你有這麼遠的XSLT? –

回答

0

它基本上

<xsl:template match="metadata/*"> 
<item> 
    <xsl:copy-of select="../../embed_code"/> 
    <metadata_name><xsl:value-of select="name()"/></metadata_name> 
    <metadata_value><xsl:value-of select="."/></metadata_value> 
</item> 
</xsl:template> 
0

請嘗試以下解決方案

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" omit-xml-declaration="yes" 
    encoding="UTF-8" indent="yes" /> 

    <xsl:template match="/"> 
    <metadata> 
     <xsl:for-each select="root/items/item"> 
     <xsl:variable name="eCode" select="embed_code"/> 
     <xsl:for-each select="metadata/*"> 
      <item> 
      <embed_code> 
       <xsl:value-of select="$eCode"/> 
      </embed_code> 
      <xsl:element name="metadata_name"> 
       <xsl:value-of select="name()"/> 
      </xsl:element> 
      <xsl:element name="metadata_value"> 
       <xsl:value-of select="."/> 
      </xsl:element> 
      </item> 
     </xsl:for-each> 
     </xsl:for-each> 
    </metadata> 
    </xsl:template> 
</xsl:transform>