1

私は自分の問題に対する答えをフォーラムで探していましたが、運がありませんでした。あなたが私を助けてくれることを願っています。XML に変換する必要がある単純な CSV ファイルがありますが (その部分は簡単です)、サブ要素が含まれるように変更する必要があります。例:

私が持っているもの:

<Unit>
        <UnitID>K000009107</UnitID>
        <DateLastModified>2003-06-23</DateLastModified>
        <Family>SAPOTACEAE</Family>
        <Genus>Pouteria</Genus>
        <Species>ferrugineo-tomentos</Species>
        <Identifier>Smith, J</Identifier>
        <StartMonth>05</StartMonth>
        <StartYear>1997</StartYear>
        <TypeStatus>Type</TypeStatus>
</Unit>

必要なもの:

<Unit>
    <UnitID>K000009107</UnitID>
    <DateLastModified>2003-06-23</DateLastModified>
    <Identification StoredUnderName="true">
        <Family>SAPOTACEAE</Family>
        <Genus>Pouteria</Genus>
        <Species>ferrugineo-tomentos</Species>
        <Identifier>Smith, J</Identifier>
        <IdentificationDate>
            <StartMonth>05</StartMonth>
            <StartYear>1997</StartYear>
        </IdentificationDate>
    <TypeStatus>Type</TypeStatus>
    </Identification>
</Unit>

大規模なデータセットでこの変更を行う必要があります。XSLT でうまくいくと思いますが、これがどのように機能するのかわかりません。何か案は?

4

1 に答える 1

0

これを行う1つの方法は次のとおりです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="/*">
  <xsl:copy>
   <xsl:apply-templates select="UnitID|DateLastModified"/>
   <Identification StoredUnderName="true">
    <xsl:apply-templates select=
     "*[not(contains('|UnitID|DateLastModified|StartMonth|StartYear|TypeStatus|',
                    concat('|',name(),'|')))]"/>
    <IdentificationDate>
     <xsl:apply-templates select="StartMonth|StartYear"/>
    </IdentificationDate>
    <xsl:apply-templates select="TypeStatus"/>
   </Identification>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<Unit>
        <UnitID>K000009107</UnitID>
        <DateLastModified>2003-06-23</DateLastModified>
        <Family>SAPOTACEAE</Family>
        <Genus>Pouteria</Genus>
        <Species>ferrugineo-tomentos</Species>
        <Identifier>Smith, J</Identifier>
        <StartMonth>05</StartMonth>
        <StartYear>1997</StartYear>
        <TypeStatus>Type</TypeStatus>
</Unit>

必要な正しい結果が生成されます。

<Unit>
   <UnitID>K000009107</UnitID>
   <DateLastModified>2003-06-23</DateLastModified>
   <Identification StoredUnderName="true">
      <Family>SAPOTACEAE</Family>
      <Genus>Pouteria</Genus>
      <Species>ferrugineo-tomentos</Species>
      <Identifier>Smith, J</Identifier>
      <IdentificationDate>
         <StartMonth>05</StartMonth>
         <StartYear>1997</StartYear>
      </IdentificationDate>
      <TypeStatus>Type</TypeStatus>
   </Identification>
</Unit>

この変換は、柔軟性を失うことを犠牲にして少し短縮できます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
  <xsl:copy>
   <xsl:copy-of select="UnitID|DateLastModified"/>
   <Identification StoredUnderName="true">
    <xsl:copy-of select=
     "*[not(contains('|UnitID|DateLastModified|StartMonth|StartYear|TypeStatus|',
                    concat('|',name(),'|')))]"/>
    <IdentificationDate>
     <xsl:copy-of select="StartMonth|StartYear"/>
    </IdentificationDate>
    <xsl:copy-of select="TypeStatus"/>
   </Identification>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>
于 2013-04-09T02:20:41.347 に答える