我是xslt的新手,我正在进行xml到xml的转换。请为我提供一个针对以下问题的xslt解决方案。 输入xml如下:
<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 :(得分: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>
答案 1 :(得分: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>