2017-03-20 3 views
0

Ich bin neu in xslt, ich arbeite an einer XML zu Xml Transformation. Bitte stellen Sie mir eine xslt-Lösung für das folgende Problem zur Verfügung. Eingabe-XML ist wie folgt:XSLT Associate eindeutigen Schlüssel zu Kind Knoten

<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> 

die Kindknoten von Metadaten dynamisch ist, Elementnamen und die Anzahl der Elemente in jedem untergeordneten Knoten von Metadaten unterschiedlich sein werden. embed_code ist ein Element mit einem eindeutigen Wert. Ich brauche drei Elemente als Kind von Element 1. embed_code, 2.metadata_name, 3.metadata_value. Element metadata_name hat den Elementnamen des untergeordneten Metadatenelements. Das Element metadata_value hat den Wert des untergeordneten Elements metadata.

Output xml muss wie unten sein:

<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

Können Sie bitte den XSLT hinzufügen, die Sie bisher haben? –

Antwort

0

Es ist im Grunde

<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

Versuchen Sie, die folgende Lösung

<?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>