0

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

我认为使用 key 功能会很容易,但是我在网上和我的 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>
4

2 回答 2

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>
于 2013-03-11T13:35:49.497 回答
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>
于 2013-03-11T13:29:25.883 回答