0

兄弟要素の 1 つのセットから、同じドキュメント内にある、異なる親要素と祖先要素を持つ類似要素のセットにコンテンツをコピーしようとしています。

これは 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 に答える