1

以前の質問 ( SSIS パッケージ経由で XML をフラット化してロードする) の解決策を試しましたが、うまくいきません。何をする必要があるかはわかりましたが、それを行う方法についてのガイダンスが必要です。

たとえば、次の XML 構造があるとします。

<person id="1">
   <name>John</name>
   <surname>Smith</surname>
   <age>25</age>
   <comment>
      <comment_id>1</comment_id>
      <comment_text>Hello</comment_text>
   </comment>
   <comment>
      <comment_id>2</comment_id>
      <comment_text>Hello again!</comment_text>
   </comment>
   <somethingelse>
       <id>1</id>
   </somethingelse>
   <comment>
      <comment_id>3</comment_id>
      <comment_text>Third Item</comment_text>
   </comment>
</person>
<person id="2">
   <name>John</name>
   <surname>Smith</surname>
   <age>25</age>
   <somethingelse>
       <id>1</id>
   </somethingelse>
</person>
...
...

これを XML ソースとして SSIS パッケージにロードする場合、次のような構造化されたテーブル出力を取得するのではなく、要素ごとに作成されたテーブルが基本的に取得されます。

  • person テーブル (名前、姓、年齢)
  • 何か別のテーブル (id)
  • コメントテーブル (comment_id, comment_text)

私が最終的に得るものは次のとおりです。

  • person テーブル (person_Id <-- 内部 SSIS ID)
  • ネームテーブル
  • 姓表
  • 年齢表
  • person_name テーブル
  • person_surname テーブル
  • person_comment_comment_id テーブル

等...

私が見つけたのは、各要素とすべての内部要素が同じ形式と一貫性を持っていない場合、上記の異常が発生し、特に80〜100列以上を扱っている場合にかなり複雑になるということです。

残念ながら、これらのレポートを生成するシステム (Lotus Notes) を変更する方法はありません。そのため、各個人のサブ要素 (およびサブ コレクション要素など)を整列できる XSLT テンプレートを明示的に持つことができるかどうか疑問に思っていました。コメントとして? すべての内部要素を再配置するより迅速な方法がない限り。

SSIS XML ソースは、次の意味で非常に一貫した XML ファイルを必要とするようです: name要素が位置 1 にある場合、個人の親内の後続のすべての名前要素は位置 1 にある必要があります。

SSIS は、あるから別の親に欠落している特定の要素がある場合、不整合を検出するように見えますが、それらの順序が正しくない場合 (A、B、C)(A、B、C)(A、C、B)、それは大騒ぎ!

すべての助けに感謝します!前もって感謝します。

4

2 に答える 2

2

From what I understand, you want a specific order for the children of <person>. See if the following XSLT is close to what you're after:

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

    <!-- XSLT identity transformation -->
    <xsl:template match="@*|node()" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="person">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:apply-templates select="name"/>
            <xsl:apply-templates select="surname"/>
            <xsl:apply-templates select="age"/>
            <xsl:apply-templates select="somethingelse"/>
            <xsl:apply-templates select="comment"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Output XML

<?xml version="1.0" encoding="UTF-8"?>
<project>
  <person id="1">
    <name>John</name>
    <surname>Smith</surname>
    <age>25</age>
    <somethingelse>
      <id>1</id>
    </somethingelse>
    <comment>
      <comment_id>1</comment_id>
      <comment_text>Hello</comment_text>
    </comment>
    <comment>
      <comment_id>2</comment_id>
      <comment_text>Hello again!</comment_text>
    </comment>
    <comment>
      <comment_id>3</comment_id>
      <comment_text>Third Item</comment_text>
    </comment>
  </person>
  <person id="2">
    <name>John</name>
    <surname>Smith</surname>
    <age>25</age>
    <somethingelse>
      <id>1</id>
    </somethingelse>
  </person>
</project>
于 2013-10-24T14:13:03.937 に答える