2013-03-02 39 views
1

我有下面的XML:XML使用XML XSLT來 - 將類似的父節點

<EMPLOYEE_LIST> 
    <EMPLOYEES_01> 
     <PERMANENT> 
      <EMPID>650000</EMPID> 
      <FIRST_NAME>KEITH</FIRST_NAME> 
      <MIDDLE_NAME>H</MIDDLE_NAME> 
      <LAST_NAME>ROGERS</LAST_NAME> 
     </PERMANENT> 
     <CONTRACTUAL> 
      <EMPID>650001</EMPID> 
      <FIRST_NAME>DARRYL</FIRST_NAME> 
      <MIDDLE_NAME>Y</MIDDLE_NAME> 
      <LAST_NAME>HANNAH</LAST_NAME> 
     </CONTRACTUAL> 
    </EMPLOYEES_01> 
    <EMPLOYEES_02> 
     <PERMANENT> 
      <EMPID>650002</EMPID> 
      <FIRST_NAME>KEITH</FIRST_NAME> 
      <MIDDLE_NAME>ROGERS</MIDDLE_NAME> 
      <LAST_NAME>H</LAST_NAME> 
     </PERMANENT> 
     <CONTRACTUAL> 
      <EMPID>650003</EMPID> 
      <FIRST_NAME>DARRYL</FIRST_NAME> 
      <MIDDLE_NAME>HANNAH</MIDDLE_NAME> 
      <LAST_NAME>Y</LAST_NAME> 
     </CONTRACTUAL> 
    </EMPLOYEES_02> 
</EMPLOYEE_LIST> 

,我使用下面的XML轉換它:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="/EMPLOYEE_LIST"> 
     <employees> 
      <xsl:apply-templates select="EMPLOYEES/node()"/> 
     </employees>   
    </xsl:template>  
    <xsl:template match="PERMANENT"> 
     <permanent> 
      <xsl:apply-templates select="*"/> 
     </permanent> 
    </xsl:template>  
    <xsl:template match="EMPID"> 
     <emp_id> 
      <xsl:value-of select="."/> 
     </emp_id> 
    </xsl:template>  
    <xsl:template match="FIRST_NAME"> 
     <f_name> 
      <xsl:value-of select="."/> 
     </f_name> 
    </xsl:template>  
    <xsl:template match="MIDDLE_NAME"> 
     <m_name> 
      <xsl:value-of select="."/> 
     </m_name> 
    </xsl:template>  
    <xsl:template match="LAST_NAME"> 
     <l_name> 
      <xsl:value-of select="."/> 
     </l_name> 
    </xsl:template> 

    <xsl:template match="CONTRACTUAL"> 
     <permanent> 
      <xsl:apply-templates select="*"/> 
     </permanent> 
    </xsl:template>  
    <xsl:template match="EMPID"> 
     <emp_id> 
      <xsl:value-of select="."/> 
     </emp_id> 
    </xsl:template>  
    <xsl:template match="FIRST_NAME"> 
     <f_name> 
      <xsl:value-of select="."/> 
     </f_name> 
    </xsl:template>  
    <xsl:template match="MIDDLE_NAME"> 
     <m_name> 
      <xsl:value-of select="."/> 
     </m_name> 
    </xsl:template>  
    <xsl:template match="LAST_NAME"> 
     <l_name> 
      <xsl:value-of select="."/> 
     </l_name> 
    </xsl:template> 
</xsl:stylesheet> 

期待與轉換後的XML以下輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<employees> 
    <employee> 
     <emp_id>650000</emp_id> 
     <f_name>KEITH</f_name> 
     <m_name>H</m_name> 
     <l_name>ROGERS</l_name> 
     <type>permanent</type> 
     <emp_id>650001</emp_id> 
     <f_name>DARRYL</f_name> 
     <m_name>Y</m_name> 
     <l_name>HANNAH</l_name> 
     <type>contractual</type> 
     <emp_id>650002</emp_id> 
     <f_name>KEITH</f_name> 
     <m_name>ROGERS</m_name> 
     <l_name>H</l_name> 
     <type>permanent</type> 
     <emp_id>650003</emp_id> 
     <f_name>DARRYL</f_name> 
     <m_name>HANNAH</m_name> 
     <l_name>Y</l_name> 
     <type>contractual</type> 
    </employee> 
</employees> 

到目前爲止我還沒有成功,因爲我是新來的,任何幫助將是應用程序reciated

感謝

回答

1

更短和更「推式」的解決方案:我的回答稍稍適應了前面的問題:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my" exclude-result-prefixes="my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<my:Renames> 
    <n old="EMPID" new="emp_id"/> 
    <n old="FIRST_NAME" new="f_name"/> 
    <n old="MIDDLE_NAME" new="m_name"/> 
    <n old="LAST_NAME" new="l_name"/> 
    <n old="PERMANENT" new="permanent"/> 
    <n old="CONTRACTUAL" new="contractual"/> 
</my:Renames> 

<xsl:variable name="vRenames" select="document('')/*/my:Renames/*"/> 

<xsl:template match="EMPLOYEE_LIST"> 
    <employees><employee><xsl:apply-templates/></employee></employees> 
</xsl:template> 

<xsl:template match="*/*/*" priority="-1"> 
    <xsl:element name="{$vRenames[@old = name(current())]/@new}"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="PERMANENT|CONTRACTUAL"> 
    <xsl:apply-templates/> 
    <type><xsl:value-of select="$vRenames[@old = name(current())]/@new"/></type> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉化應用到所提供的XML文檔:

<EMPLOYEE_LIST> 
    <EMPLOYEES_01> 
     <PERMANENT> 
      <EMPID>650000</EMPID> 
      <FIRST_NAME>KEITH</FIRST_NAME> 
      <MIDDLE_NAME>H</MIDDLE_NAME> 
      <LAST_NAME>ROGERS</LAST_NAME> 
     </PERMANENT> 
     <CONTRACTUAL> 
      <EMPID>650001</EMPID> 
      <FIRST_NAME>DARRYL</FIRST_NAME> 
      <MIDDLE_NAME>Y</MIDDLE_NAME> 
      <LAST_NAME>HANNAH</LAST_NAME> 
     </CONTRACTUAL> 
    </EMPLOYEES_01> 
    <EMPLOYEES_02> 
     <PERMANENT> 
      <EMPID>650002</EMPID> 
      <FIRST_NAME>KEITH</FIRST_NAME> 
      <MIDDLE_NAME>ROGERS</MIDDLE_NAME> 
      <LAST_NAME>H</LAST_NAME> 
     </PERMANENT> 
     <CONTRACTUAL> 
      <EMPID>650003</EMPID> 
      <FIRST_NAME>DARRYL</FIRST_NAME> 
      <MIDDLE_NAME>HANNAH</MIDDLE_NAME> 
      <LAST_NAME>Y</LAST_NAME> 
     </CONTRACTUAL> 
    </EMPLOYEES_02> 
</EMPLOYEE_LIST> 

想要的,正確的結果產生:

<employees> 
    <employee> 
     <emp_id>650000</emp_id> 
     <f_name>KEITH</f_name> 
     <m_name>H</m_name> 
     <l_name>ROGERS</l_name> 
     <type>permanent</type> 
     <emp_id>650001</emp_id> 
     <f_name>DARRYL</f_name> 
     <m_name>Y</m_name> 
     <l_name>HANNAH</l_name> 
     <type>contractual</type> 
     <emp_id>650002</emp_id> 
     <f_name>KEITH</f_name> 
     <m_name>ROGERS</m_name> 
     <l_name>H</l_name> 
     <type>permanent</type> 
     <emp_id>650003</emp_id> 
     <f_name>DARRYL</f_name> 
     <m_name>HANNAH</m_name> 
     <l_name>Y</l_name> 
     <type>contractual</type> 
    </employee> 
</employees> 
+0

如果我將父節點名稱從EMPLOYEES_02修改爲ESTRANGED_02,您的建議是否可行? – 2013-03-02 19:53:45

+0

@ReggieMiller,是的,只是試試:) – 2013-03-02 19:59:32

+0

還沒有嘗試過整個XML,但你能告訴我,如果有一種方法可以在轉換過程中截斷/省去不需要的元素嗎?假設我想在轉換過程中截斷l_name,以便生成的xml只有f_name/m_name?可以在此代碼中完成嗎? – 2013-03-02 20:48:56

1

我將使用Dimitre的回答你剛纔的問題爲基礎在這裏,因爲它比我更簡潔:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my" exclude-result-prefixes="my"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <my:Renames> 
    <n old="EMPLOYEES" new="employees"/> 
    <n old="EMPID" new="emp_id"/> 
    <n old="FIRST_NAME" new="f_name"/> 
    <n old="MIDDLE_NAME" new="m_name"/> 
    <n old="LAST_NAME" new="l_name"/> 
    <n old="PERMANENT" new="permanent"/> 
    <n old="CONTRACTUAL" new="contractual"/> 
    </my:Renames> 

    <xsl:variable name="vRenames" select="document('')/*/my:Renames/*"/> 

    <xsl:template match="EMPLOYEE_LIST"> 
    <employees> 
     <employee> 
     <xsl:apply-templates select="*/*" /> 
     </employee> 
    </employees> 
    </xsl:template> 

    <xsl:template match="*/*" priority="-1"> 
    <xsl:element name="{$vRenames[@old = name(current())]/@new}"> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="PERMANENT|CONTRACTUAL"> 
    <xsl:apply-templates/> 
    <type> 
     <xsl:value-of select="$vRenames[@old = name(current())]/@new"/> 
    </type> 
    </xsl:template> 
</xsl:stylesheet> 

新的部分是這樣的:

<xsl:template match="EMPLOYEE_LIST"> 
    <employees> 
     <employee> 
     <xsl:apply-templates select="*/*" /> 
     </employee> 
    </employees> 
    </xsl:template> 

當您在上面輸入您的樣本時,會生成:

<employees> 
    <employee> 
    <emp_id>650000</emp_id> 
    <f_name>KEITH</f_name> 
    <m_name>H</m_name> 
    <l_name>ROGERS</l_name> 
    <type>permanent</type> 
    <emp_id>650001</emp_id> 
    <f_name>DARRYL</f_name> 
    <m_name>Y</m_name> 
    <l_name>HANNAH</l_name> 
    <type>contractual</type> 
    <emp_id>650002</emp_id> 
    <f_name>KEITH</f_name> 
    <m_name>ROGERS</m_name> 
    <l_name>H</l_name> 
    <type>permanent</type> 
    <emp_id>650003</emp_id> 
    <f_name>DARRYL</f_name> 
    <m_name>HANNAH</m_name> 
    <l_name>Y</l_name> 
    <type>contractual</type> 
    </employee> 
</employees>