2016-07-26 70 views
0

我的投入是公司的組織。結構在XML中,有多個部門和子部門。組織中子部門的級別。結構在標籤LEVEL中給出。XSLT:具有遞歸節點的具有XML級別的XML列表

輸出也應該是包含多個部門的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> 

我希望有人可以幫助一些輸入如何繼續。

回答

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> 
+0

非常感謝。它工作完美。我希望能夠以一種簡短而好的方式來完成 - 但是,以我有限的經驗,這是不可能的。有經驗的人會幫助,這總是很好的。 – Gitte