フラット構造 (親/子 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 <= $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>