【问题标题】:xslt associate unique key to child nodesxslt 将唯一键关联到子节点
【发布时间】:2017-03-20 12:50:25
【问题描述】:

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

【问题讨论】:

  • 能否添加您目前拥有的 XSLT?

标签: xslt xslt-1.0 xslt-2.0


【解决方案1】:

基本上是

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

【讨论】:

    【解决方案2】:

    尝试以下解决方案

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      相关资源
      最近更新 更多