使用XSLT将xml元素内容传输到另一组元素

时间:2013-03-11 13:05:38

标签: xml xslt

我试图将内容从一组兄弟元素复制到位于同一文档中具有不同父元素和祖先元素的一组相似元素。

我认为使用键功能会很容易,但我在网上和我的xslt食谱中找到的所有例子都引用了匹配属性而不是元素。

我一直在研究这个问题几个小时,我非常沮丧。我是xml和xslt的新手。

注意 - 下面的例子代表了我正在尝试完成的一个例子。我正在使用的实际文档包含50多个包含相关内容的兄弟数据元素。为没有图片而道歉(声誉不够高)。

启动xml

<?xml version="1.0" encoding="UTF-8"?>

<DE>
  <set1>
    <Type>
      <Thing>
        <title></title>
        <year></year>
        <Author></Author>
        <Store></Store>
      </Thing>
    </Type>
  </set1>

  <record>
    <title>WorkPlease</title>
    <year>2012</year>
    <Author>Jimmy</Author>
    <Store>ArmyStore</Store>
  </record>

</DE> 

期望的最终状态


<?xml version="1.0" encoding="UTF-8"?>

 <DE>
  <set1>
    <Type>
      <Thing>
        <title>WorkPlease</title>
        <year>2012</year>
        <Author>Jimmy</Author>
        <Store>ArmyStore</Store>
      </Thing>
    </Type>
  </set1>

  <record>
    <title>WorkPlease</title>
    <year>2012</year>
    <Author>Jimmy</Author>
    <Store>ArmyStore</Store>
  </record>

</DE>

2 个答案:

答案 0 :(得分:0)

使用以下XSLT:

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

  <xsl:template match="/DE">
    <DE>
      <!-- 'set1' contents -->
      <xsl:apply-templates select="record" mode="sets" />

      <!-- 'record' contents -->
      <xsl:apply-templates select="record" />
    </DE>
  </xsl:template>

  <xsl:template match="record">
    <!-- copy 'record' tag along with it's children -->
    <xsl:copy-of select="." />
  </xsl:template>

  <xsl:template match="record" mode="sets">
    <set1>
      <Type>
        <Thing>
          <!-- copy 'record' tag's children without the 'record' tag itself -->
          <xsl:copy-of select="node()" />
        </Thing>
      </Type>
    </set1>
  </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

来自@kamituel的解决方案要先进得多,但可能这段代码可以帮助您了解xslt的工作方式

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

  <xsl:template match="record">
    <xsl:element name="DE">
      <xsl:element name="set1">
        <xsl:element name="Type">
          <xsl:element name="Thing">
            <xsl:call-template name="copy-attributes"/>
          </xsl:element>
        </xsl:element>
      </xsl:element>
    <xsl:call-template name="create-record"/>
    </xsl:element>
  </xsl:template>

  <xsl:template name="copy-attributes">
    <xsl:copy-of select="."/>
  </xsl:template>

  <xsl:template name="create-record">
    <xsl:copy-of select="."/>
  </xsl:template>

</xsl:stylesheet>