2013-03-29 43 views
0

我想创建一个转换,将平面结构(与父/子id)映射到分层结构。 我在下面包含了一个简单的例子。实际数据有超过4000个元素。我没有关于最大深度的数据,这个变换应该能够递归到n级。 感谢这篇文章xslt-flat-to-hierarchical我试图按照它的模式来适应我的情况。不幸的是,它不是递归的!任何帮助将非常感激! 谢谢!xslt为平面到分层xml

这里是源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> 

回答

0

我认为问题出在你的初始申请模板上

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

看你的XML中,ID家长元素的形式为“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))"> 
+0

嗨蒂姆 - 非常感谢你的帮助。从0到'000000'的变化取得了诀窍!对于一个新手来说,我可能有点过于雄心勃勃,但是像你这样的人,我不妨去尝试一下! :) – johnaco