xslt将唯一键与子节点相关联

时间:2017-03-20 12:50:26

标签: xslt xslt-1.0 xslt-2.0

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

2 个答案:

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