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,IDPARENT元素的格式为“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 回答