0

フラット構造 (親/子 ID を持つ) を階層構造にマップする変換を作成しようとしています。以下に簡単な例を含めました。実際のデータには 4000 を超える要素があります。最大深度に関するデータはありませんが、変換は n レベルまで再帰できるはずです。この投稿xslt-flat-to-hierarchical のおかげで、そのパターンを自分の状況に合わせようとしました。残念ながら、それは再帰的ではありません! どんな助けでも本当に感謝します! ありがとう!

ここにソースxmlがあります....

<?xml version='1.0' encoding='UTF-8'?> 
<asx:abap xmlns:asx='http://www.sap.com/abapxml' version='1.0'>
  <asx:values>
    <SYSINFO>
      <SERVER_NAME>sapserver</SERVER_NAME>
      <SYSTEM_ID>EC2</SYSTEM_ID>
    </SYSINFO>
    <CT/>
    <PACKAGES/>
    <SW_COMPONENTS/>
    <APP_COMPONENTS>
      <item>
        <ID>000001</ID>
        <NAME>HLA0009999</NAME>
        <PARENT>000000</PARENT>
        <CHILD>000002</CHILD>
        <TEXT>SAP</TEXT>
        <TEXT4>Application Components</TEXT4>
      </item>
      <item>
        <ID>000002</ID>
        <NAME>ABA0000311</NAME>
        <PARENT>000001</PARENT>
        <CHILD>000003</CHILD>
        <TEXT>AP</TEXT>
        <TEXT4>Application Platform</TEXT4>
      </item>
      <item>
        <ID>000003</ID>
        <NAME>KPE0000001</NAME>
        <PARENT>000002</PARENT>
        <CHILD>000000</CHILD>
        <TEXT>AP-PPE</TEXT>
        <TEXT4>Integrated Product and Process Engineering</TEXT4>
      </item>
      <item>
        <ID>000004</ID>
        <NAME>S6D0000006</NAME>
        <PARENT>000002</PARENT>
        <CHILD>000005</CHILD>
        <TEXT>AP-CME</TEXT>
        <TEXT4>Classification System (New)</TEXT4>
      </item>
      <item>
        <ID>000005</ID>
        <NAME>S6D0000007</NAME>
        <PARENT>000004</PARENT>
        <CHILD>000000</CHILD>
        <TEXT>AP-CME-CHR</TEXT>
        <TEXT4>Characteristic</TEXT4>
      </item>
    </APP_COMPONENTS>
  </asx:values>
</asx:abap>

ここに目的のxmlがあります

<?xml version='1.0' encoding='UTF-8'?> 
    <SYSINFO>
      <SERVER_NAME>sapserver</SERVER_NAME>
      <SYSTEM_ID>EC2</SYSTEM_ID>
    </SYSINFO>
    <CT/>
    <PACKAGES/>
    <SW_COMPONENTS/>
    <APP_COMPONENTS>
      <APP_COMPONENT NR="000001" ID="HLA0009999" NAME="SAP" DESCRIPTION="Application Components" >
          <APP_COMPONENT NR="000002" ID="ABA0000311" NAME="AP" DESCRIPTION="Application Platform" >
              <APP_COMPONENT NR="000003" ID="KPE0000001" NAME="AP-PP3" DESCRIPTION="Integrated Product and Process Engineering" >
                 <APP_COMPONENT NR="000004" ID="S6D0000006" NAME="AP-CME" DESCRIPTION="Classification System (New)" >
                     <APP_COMPONENT NR="000005" ID="S6D0000007" NAME="AP-CME-CHR" DESCRIPTION="Characteristic" >
                     </APP_COMPONENT>
                 </APP_COMPONENT>
              </APP_COMPONENT>
          </APP_COMPONENT>
       </APP_COMPONENT>
    </APP_COMPONENTS>

これが私が使用しようとしている変換です:

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

    <xsl:output indent="yes"/>

    <xsl:key name="sons" match="item" use="PARENT"/>
    <xsl:param name="maxLevels">999</xsl:param>

    <xsl:template match="APP_COMPONENTS">
        <APP_COMPONENT_H>
            <APP_COMPONENTS>
                <xsl:apply-templates select="key('sons', 0)"/>
            </APP_COMPONENTS>
        </APP_COMPONENT_H>
    </xsl:template>

    <xsl:template match="item">
        <xsl:param name="level">1</xsl:param>
        <xsl:if test="$level &lt;= $maxLevels">
            <APP_COMPONENT NR="{ID}" ID="{NAME}" NAME="{TEXT}" DESCRIPTION="{TEXT4}" >
                <APP_COMPONENTS>
                    <xsl:apply-templates select="key('sons', ID)">
                        <xsl:with-param name="level" select="$level  + 1"/>
                    </xsl:apply-templates>
                </APP_COMPONENTS>
            </APP_COMPONENT>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>
4

1 に答える 1

0

問題は最初の適用テンプレートにあると思います

 <xsl:apply-templates select="key('sons', 0)"/>

XML を見ると、ID要素とPARENT要素の形式が「000000」であるため、XSLT はここで文字列の比較を行っています。

あなたが試すことができるのは、最初の適用テンプレートをこれに変更することです

<xsl:apply-templates select="key('sons', '000000')"/>

または、数値比較を行うには、次のようにキーを定義します

<xsl:key name="sons" match="item" use="number(PARENT)"/>

そして、キーを使用するときは、これを行います

<xsl:apply-templates select="key('sons', number(ID))">
于 2013-03-29T09:51:13.877 に答える