XSLT:具有递归节点的XML级别的XML列表

时间:2016-07-26 10:56:58

标签: xml xslt-1.0

我的意见是公司的组织。 XML结构,有多个部门和子部门。组织中子部门的级别。结构在标签LEVEL中给出。

输出也应该是具有多个部门的XML。但现在子部门应该处于递归节点。 DepartmentList和SubDepartmentList都包含一个或多个Department(或零),Department在Details下有SubDepartmentList。

我使用的工具只知道XSLT 1.0,所以我希望在这个版本中可以解决。

输入示例(仅1个部门):

<?xml version="1.0" encoding="UTF-8"?>
<Z_HR_HRM_SYNC_DEPARTMENTS>
    <IT_ORG>
        <item>
            <ORGEH>50013998</ORGEH>
            <ORGEH_PARENT>50000025</ORGEH_PARENT>
            <TITLE>Title 50013998</TITLE>
            <SUB_DEP>
                <item>
                    <LEVEL>1</LEVEL>
                    <ORGEH>50014000</ORGEH>
                    <ORGEH_PARENT>50013998</ORGEH_PARENT>
                    <TITLE>Title 50014000</TITLE>
                </item>
                <item>
                    <LEVEL>1</LEVEL>
                    <ORGEH>50000849</ORGEH>
                    <ORGEH_PARENT>50013998</ORGEH_PARENT>
                    <TITLE>Title 50000849</TITLE>
                </item>
                <item>
                    <LEVEL>2</LEVEL>
                    <ORGEH>50017825</ORGEH>
                    <ORGEH_PARENT>50000849</ORGEH_PARENT>
                    <TITLE>Title 50017825</TITLE>
                </item>
                <item>
                    <LEVEL>2</LEVEL>
                    <ORGEH>50001684</ORGEH>
                    <ORGEH_PARENT>50000849</ORGEH_PARENT>
                    <TITLE>Title 50001684</TITLE>
                </item>
                <item>
                    <LEVEL>2</LEVEL>
                    <ORGEH>50012716</ORGEH>
                    <ORGEH_PARENT>50000849</ORGEH_PARENT>
                    <TITLE>Title 50012716</TITLE>
                </item>
                <item>
                    <LEVEL>3</LEVEL>
                    <ORGEH>50001709</ORGEH>
                    <ORGEH_PARENT>50012716</ORGEH_PARENT>
                    <TITLE>Title 50001709</TITLE>
                </item>
                <item>
                    <LEVEL>2</LEVEL>
                    <ORGEH>50012713</ORGEH>
                    <ORGEH_PARENT>50000849</ORGEH_PARENT>
                    <TITLE>Title 50012713</TITLE>
                </item>
                <item>
                    <LEVEL>2</LEVEL>
                    <ORGEH>50001694</ORGEH>
                    <ORGEH_PARENT>50000849</ORGEH_PARENT>
                    <TITLE>Title 50001694</TITLE>
                </item>
                <item>
                    <LEVEL>3</LEVEL>
                    <ORGEH>50010284</ORGEH>
                    <ORGEH_PARENT>50001694</ORGEH_PARENT>
                    <TITLE>Title 50010284</TITLE>
                </item>
                <item>
                    <LEVEL>3</LEVEL>
                    <ORGEH>50001695</ORGEH>
                    <ORGEH_PARENT>50001694</ORGEH_PARENT>
                    <TITLE>Title 50001695</TITLE>
                </item>
                <item>
                    <LEVEL>4</LEVEL>
                    <ORGEH>50001697</ORGEH>
                    <ORGEH_PARENT>50001695</ORGEH_PARENT>
                    <TITLE>Title 50001697</TITLE>
                </item>
            </SUB_DEP>
        </item>
    </IT_ORG>
</Z_HR_HRM_SYNC_DEPARTMENTS>

手工制作相应的输出:

<?xml version="1.0" encoding="UTF-8"?>
<ns1:BatchSyncDepartments xmlns:ns1="http://schemas.hr-manager.net/remoting/1.0/">
<ns1:request>
    <ns1:DepartmentList>
        <ns1:Department>
            <ns1:Id>
                <ns1:ThirdPartyId>50013998</ns1:ThirdPartyId>
            </ns1:Id>
            <ns1:ParentDepartmentId>
                <ns1:ThirdPartyId>50000025</ns1:ThirdPartyId>
            </ns1:ParentDepartmentId>
            <ns1:Title>Title 50013998</ns1:Title>
            <ns1:Details>
                <ns1:SubDepartmentList>
                    <ns1:Department>
                        <ns1:Id>
                            <ns1:ThirdPartyId>50014000</ns1:ThirdPartyId>
                        </ns1:Id>
                        <ns1:ParentDepartmentId>
                            <ns1:ThirdPartyId>50013998</ns1:ThirdPartyId>
                        </ns1:ParentDepartmentId>
                        <ns1:Title>Title 50014000</ns1:Title>
                        <ns1:Details>
                            <ns1:SubDepartmentList/>
                        </ns1:Details>
                    </ns1:Department>
                    <ns1:Department>
                        <ns1:Id>
                            <ns1:ThirdPartyId>50000849</ns1:ThirdPartyId>
                        </ns1:Id>
                        <ns1:ParentDepartmentId>
                            <ns1:ThirdPartyId>50013998</ns1:ThirdPartyId>
                        </ns1:ParentDepartmentId>
                        <ns1:Title>Title 50000849</ns1:Title>
                        <ns1:Details>
                            <ns1:SubDepartmentList>
                                <ns1:Department>
                                    <ns1:Id>
                                        <ns1:ThirdPartyId>50017825</ns1:ThirdPartyId>
                                    </ns1:Id>
                                    <ns1:ParentDepartmentId>
                                        <ns1:ThirdPartyId>50000849</ns1:ThirdPartyId>
                                    </ns1:ParentDepartmentId>
                                    <ns1:Title>Title 50017825</ns1:Title>
                                    <ns1:Details>
                                        <ns1:SubDepartmentList/>
                                    </ns1:Details>
                                </ns1:Department>
                                <ns1:Department>
                                    <ns1:Id>
                                        <ns1:ThirdPartyId>50001684</ns1:ThirdPartyId>
                                    </ns1:Id>
                                    <ns1:ParentDepartmentId>
                                        <ns1:ThirdPartyId>50000849</ns1:ThirdPartyId>
                                    </ns1:ParentDepartmentId>
                                    <ns1:Title>Title 50001684</ns1:Title>
                                    <ns1:Details>
                                        <ns1:SubDepartmentList/>
                                    </ns1:Details>
                                </ns1:Department>
                                <ns1:Department>
                                    <ns1:Id>
                                        <ns1:ThirdPartyId>50012716</ns1:ThirdPartyId>
                                    </ns1:Id>
                                    <ns1:ParentDepartmentId>
                                        <ns1:ThirdPartyId>50000849</ns1:ThirdPartyId>
                                    </ns1:ParentDepartmentId>
                                    <ns1:Title>Title 50012716</ns1:Title>
                                    <ns1:Details>
                                        <ns1:SubDepartmentList>
                                            <ns1:Department>
                                                <ns1:Id>
                                                    <ns1:ThirdPartyId>50001709</ns1:ThirdPartyId>
                                                </ns1:Id>
                                                <ns1:ParentDepartmentId>
                                                    <ns1:ThirdPartyId>50012716</ns1:ThirdPartyId>
                                                </ns1:ParentDepartmentId>
                                                <ns1:Title>Title 50001709</ns1:Title>
                                                <ns1:Details>
                                                    <ns1:SubDepartmentList/>
                                                </ns1:Details>
                                            </ns1:Department>
                                        </ns1:SubDepartmentList>
                                    </ns1:Details>
                                </ns1:Department>
                                <ns1:Department>
                                    <ns1:Id>
                                        <ns1:ThirdPartyId>50012713</ns1:ThirdPartyId>
                                    </ns1:Id>
                                    <ns1:ParentDepartmentId>
                                        <ns1:ThirdPartyId>50000849</ns1:ThirdPartyId>
                                    </ns1:ParentDepartmentId>
                                    <ns1:Title>Title 50012713</ns1:Title>
                                    <ns1:Details>
                                        <ns1:SubDepartmentList/>
                                    </ns1:Details>
                                </ns1:Department>
                                <ns1:Department>
                                    <ns1:Id>
                                        <ns1:ThirdPartyId>50001694</ns1:ThirdPartyId>
                                    </ns1:Id>
                                    <ns1:ParentDepartmentId>
                                        <ns1:ThirdPartyId>50000849</ns1:ThirdPartyId>
                                    </ns1:ParentDepartmentId>
                                    <ns1:Title>Title 50001694</ns1:Title>
                                    <ns1:Details>
                                        <ns1:SubDepartmentList>
                                            <ns1:Department>
                                                <ns1:Id>
                                                    <ns1:ThirdPartyId>50010284</ns1:ThirdPartyId>
                                                </ns1:Id>
                                                <ns1:ParentDepartmentId>
                                                    <ns1:ThirdPartyId>50001694</ns1:ThirdPartyId>
                                                </ns1:ParentDepartmentId>
                                                <ns1:Title>Title 50010284</ns1:Title>
                                                <ns1:Details>
                                                    <ns1:SubDepartmentList/>
                                                </ns1:Details>
                                            </ns1:Department>
                                            <ns1:Department>
                                                <ns1:Id>
                                                    <ns1:ThirdPartyId>50001695</ns1:ThirdPartyId>
                                                </ns1:Id>
                                                <ns1:ParentDepartmentId>
                                                    <ns1:ThirdPartyId>50001694</ns1:ThirdPartyId>
                                                </ns1:ParentDepartmentId>
                                                <ns1:Title>Title 50001695</ns1:Title>
                                                <ns1:Details>
                                                    <ns1:SubDepartmentList>
                                                        <ns1:Department>
                                                            <ns1:Id>
                                                                <ns1:ThirdPartyId>50001697</ns1:ThirdPartyId>
                                                            </ns1:Id>
                                                            <ns1:ParentDepartmentId>
                                                                <ns1:ThirdPartyId>50001695</ns1:ThirdPartyId>
                                                            </ns1:ParentDepartmentId>
                                                            <ns1:Title>Title 50001697</ns1:Title>
                                                            <ns1:Details>
                                                                <ns1:SubDepartmentList/>
                                                            </ns1:Details>
                                                        </ns1:Department>
                                                    </ns1:SubDepartmentList>
                                                </ns1:Details>
                                            </ns1:Department>
                                        </ns1:SubDepartmentList>
                                    </ns1:Details>
                                </ns1:Department>
                            </ns1:SubDepartmentList>
                        </ns1:Details>
                    </ns1:Department>
                </ns1:SubDepartmentList>
            </ns1:Details>
        </ns1:Department>
    </ns1:DepartmentList>
</ns1:request>
</ns1:BatchSyncDepartments>

我不再使用XSLT并且只解决了简单的问题,但现在我被卡住了:

<?xml version="1.0" encoding="UTF-8"?>

    

<xsl:template match="Z_HR_HRM_SYNC_DEPARTMENTS">
    <ns1:BatchSyncDepartments xmlns:ns1="http://schemas.hr-manager.net/remoting/1.0/">
        <ns1:request>
            <ns1:DepartmentList>
                <xsl:for-each select="IT_ORG/item">
                    <ns1:Department>
                        <ns1:Id>
                            <ns1:ThirdPartyId>
                                <xsl:value-of select="ORGEH"/>
                            </ns1:ThirdPartyId>
                        </ns1:Id>
                        <ns1:ParentDepartmentId>
                            <ns1:ThirdPartyId>
                                <xsl:value-of select="ORGEH_PARENT"/>
                            </ns1:ThirdPartyId>
                        </ns1:ParentDepartmentId>
                        <ns1:Title>
                            <xsl:value-of select="TITLE"/>
                        </ns1:Title>
                        <ns1:Details>
                            <ns1:SubDepartmentList>
                            </ns1:SubDepartmentList>
                        </ns1:Details>
                    </ns1:Department>
                </xsl:for-each>
            </ns1:DepartmentList>
        </ns1:request>
    </ns1:BatchSyncDepartments>
</xsl:template>
</xsl:stylesheet>

我希望有人可以提供一些帮助,如何继续。

1 个答案:

答案 0 :(得分:0)

  

但现在子部门应该处于递归节点。

为此,您应该采用递归处理方法:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="http://schemas.hr-manager.net/remoting/1.0/">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="child" match="item" use="ORGEH_PARENT" />

<xsl:template match="Z_HR_HRM_SYNC_DEPARTMENTS">
    <ns1:BatchSyncDepartments xmlns:ns1="http://schemas.hr-manager.net/remoting/1.0/">
        <ns1:request>
            <ns1:DepartmentList>
                <xsl:apply-templates select="IT_ORG/item"/>
            </ns1:DepartmentList>
        </ns1:request>
    </ns1:BatchSyncDepartments>  
</xsl:template>             

 <xsl:template match="item">
    <ns1:Department>
        <ns1:Id>
            <ns1:ThirdPartyId>
                <xsl:value-of select="ORGEH"/>
            </ns1:ThirdPartyId>
        </ns1:Id>
        <ns1:ParentDepartmentId>
            <ns1:ThirdPartyId>
                <xsl:value-of select="ORGEH_PARENT"/>
            </ns1:ThirdPartyId>
        </ns1:ParentDepartmentId>
        <ns1:Title>
            <xsl:value-of select="TITLE"/>
        </ns1:Title>
        <ns1:Details>
            <ns1:SubDepartmentList>
                <xsl:apply-templates select="key('child', ORGEH)"/>
            </ns1:SubDepartmentList>
        </ns1:Details>
    </ns1:Department>
</xsl:template>

</xsl:stylesheet>