2012-04-09 111 views
1

考慮我的輸入XML文件如下需要使用XSLT其XSL文件使用properties.xml文件轉換XML文件轉換成另一個XML

 <?xml version="1.0" encoding="UTF-8"?> 
     <com xsi:schemaLocation="http://do.way.com/sales/Amb 
      http://do.way.com/temp/sales/ale/ax.xsd" 
      xmlns:w="http://do.way.com/sales/W" 
      xmlns="http://do.way.com/sales/Amb" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:wire="http://do.way.com/sales/Wire"> 

    <content> 
     <wire:wire> 
     <wire:sI> 

      <w:aH> 
      <text>Ccc <dynamic name="C_R_N"/>: More</text> 
      <w:contact value="false"/> 
      </w:aH> 

      <w:page> 
      <nL>Please call us</nL> 
      </w:page> 

      <w:body> 
      <text> C R N: <strong> 
      <dynamic name="C_R_N"/></strong> 
      </text> 
      </w:body> 

      <w:body> 
      <text> 
       RE: <dynamic name="D_C_P"/> <dynamic name="M_C_O"/> 
      </text> 
      </w:body> 

      <w:body> 
      <text> 
       In order <strong> 
       <dynamic name="M_D_D"/> 
       </strong>, we need some information. 
      </text> 
      </w:body> 

      <w:body> 
      <text> 
       <strong> 
       Please call us <dynamic name="C_P_D_N"/>. 
       </strong> Our hours <ul class="nested"> 
       <li> 
        Monday - Friday, 
    <dynamic name="DST_M_F_S_Hour"/> am - 
    <dynamic name="DST_M_F_E_Hour"/> pm; Saturday, 
    <dynamic name="DST_M_F_S_Hour"/> am - 
    <dynamic name="DST_M_F_E_Hour"/> pm. 
       </li> 
         </ul> 
      </text> 
      </w:body> 

      <w:body> 
      <text> 
       Thank you for your action. . 
      </text> 
      </w:body> 


      <w:body> 
      <text> 
       <dynamic name="C_D_N"/> 
      </text> 
      </w:body> 


      <w:TextAndImage> 
      <text> 
      <dynamic name="C_S_N_D"/>    
      </text> 
      </w:TextAndImage> 

      <w:dynamicNames> 
      <w:dynamicName value="LOW"/> 
      <w:dynamicName value="Env"/> 
      </w:dynamicNames> 

      </wire:sI> 
     </wire:wire> 

      </content> 
      </com>  

,其將上述輸入XML文件是指所需的XSL文件其具有用於輸入XML標籤元件(鍵)的各變換標記(值)一個properties.xml文件下面給出 properties.xml中

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

      <Properties>  
      <Property value="w:aH">aHe</Property> 
      <Property value="w:contact">contact1</Property> 
      <Property value="w:page">pageH</Property> 
      <Property value="w:body">bodyP</Property> 
      <Property value="w:TextAndImage">textAndImage1</Property> 
      <Property value="w:dynamicNames">dynamicNames1</Property> 
      <Property value="w:dynamicName">dynamicValName</Property> 
     </Properties> 

和我的轉換的XML看起來像

<Content xsi:schemaLocation="id:d1234 http://abc:10/w/g/B/System/abc.xsd" 
xmlns="id:d1234" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 


    <aHe> 
     <text>Ccc 
      <dynamic name="C_R_N" xmlns="http://www.w3.org/1999/xhtml" > 
        C_R_N 
      </dynamic> 
     : More 
    </text> 
     <contact1>false</contact1> 
     </aHe> 

     <pageH> 
     <nL>Please call us</nL> 
     </pageH> 

     <bodyP> 
     <text> C R N: <strong> 
     <dynamic name="C_R_N" xmlns="http://www.w3.org/1999/xhtml"> 
     C_R_N 
    </dynamic> 
     </strong> 
     </text> 
     </bodyP> 

     <bodyP> 
     <text> 
      RE: <dynamic name="D_C_P" xmlns="http://www.w3.org/1999/xhtml"> 
       D_C_P</dynamic> 
      <dynamic name="M_C_O" xmlns="http://www.w3.org/1999/xhtml">M_C_O</dynamic> 
     </text> 
     </bodyP> 

     <bodyP> 
     <text> 
      In order <strong> 
      <dynamic name="M_D_D" xmlns="http://www.w3.org/1999/xhtml"> M_D_D </dynamic> 
      </strong>, we need some information. 
     </text> 
     </bodyP> 

     <bodyP> 
     <text> Please call us 
      <strong> 
      <dynamic name="C_P_D_N" xmlns="http://www.w3.org/1999/xhtml">C_P_D_N</dynamic>. 
      </strong> Our hours <ul class="nested"> 
      <li> 
       Monday - Friday, <dynamic name="DST_M_F_S_Hour" xmlns="http://www.w3.org/1999/xhtml">DST_M_F_S_Hour</dynamic> am - <dynamic name="DST_M_F_E_Hour" xmlns="http://www.w3.org/1999/xhtml">DST_M_F_E_Hour</dynamic> pm; Saturday, <dynamic name="DST_M_F_S_Hour" xmlns="http://www.w3.org/1999/xhtml">DST_M_F_S_Hour</dynamic> am - <dynamic name="DST_M_F_E_Hour" xmlns="http://www.w3.org/1999/xhtml"> 
       DST_M_F_E_Hour</dynamic>pm. 
      </li> 
        </ul> 
     </text> 
     </bodyP> 

     <bodyP> 
     <text> 
      Thank you for your action. . 
     </text> 
     </bodyP> 


     <bodyP> 
     <text> 
      <dynamic name="C_D_N" xmlns="http://www.w3.org/1999/xhtml"> 
      C_D_N </dynamic> 
     </text> 
     </bodyP> 


     <textAndImage> 
     <text> 
      <dynamic name="C_S_N_D" xmlns="http://www.w3.org/1999/xhtml"> 
      C_S_N_D </dynamic> 
     </text> 
     </textAndImage> 

     <dynamicNames1> 
     <dynamicValName>LOW</dynamicValName> 
     <dynamicValName>Env</dynamicValName> 
     </dynamicNames1> 

    </Content> 


     Can anyone provide me with the xsl file which meets my requirement. 
+0

有人可以構建一個xsl,它進行必要的轉換 – 2012-04-09 10:41:15

+0

@ hroptatyr:嗨,請通過上面的問題,並建議我適當的xsl文件。 – 2012-04-09 11:33:52

+0

@mzjn:是的,但面對許多問題與其中一個或另一個得到確切的轉換輸出。 – 2012-04-09 11:35:09

回答

1

它看起來像你不需要因爲你只是擺脫命名空間的屬性文件,它可以做簡單得多:

<xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="node() | @*"/> 
    </xsl:element> 
</xsl:template> 
<xsl:template match="@*"> 
    <xsl:copy/> 
</xsl:template> 

你想要達到什麼樣的其餘部分是純大概XSLT東東。

編輯

更新包括的東西,可以讓你更接近你的目標

<xsl:template match="/"> 
    <Content> 
     <xsl:apply-templates/> 
    </Content> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:copy/> 
</xsl:template> 

<xsl:template match="* [local-name() != 'com' and local-name() != 'content' and local-name() != 'wire' and local-name() != 'sI']"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="node() | @*"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="* [local-name() = 'dynamic']"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="node() | @*"/> 
     <xsl:value-of select="@name"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="* [local-name() = 'contact' or local-name()='dynamicName']"> 
    <xsl:element name="{local-name()}"> 
     <xsl:value-of select="@value"/> 
    </xsl:element> 
</xsl:template> 

結果是

<?xml version="1.0" encoding="UTF-8"?> 
<Content> 
    <aH> 
     <text>Ccc <dynamic name="C_R_N">C_R_N</dynamic>: More</text> 
     <contact>false</contact> 
    </aH> 
    <page> 
     <nL>Please call us</nL> 
    </page> 
    <body> 
     <text> C R N: <strong> 
       <dynamic name="C_R_N">C_R_N</dynamic> 
      </strong></text> 
    </body> 
    <body> 
     <text> 
       RE: <dynamic name="D_C_P">D_C_P</dynamic><dynamic name="M_C_O">M_C_O</dynamic></text> 
    </body> 
    <body> 
     <text> 
       In order <strong> 
       <dynamic name="M_D_D">M_D_D</dynamic> 
      </strong>, we need some information. 
      </text> 
    </body> 
    <body> 
     <text><strong> 
       Please call us <dynamic name="C_P_D_N">C_P_D_N</dynamic>. 
       </strong> Our hours <ul class="nested"> 
       <li> 
        Monday - Friday, 
    <dynamic name="DST_M_F_S_Hour">DST_M_F_S_Hour</dynamic> am - 
    <dynamic name="DST_M_F_E_Hour">DST_M_F_E_Hour</dynamic> pm; Saturday, 
    <dynamic name="DST_M_F_S_Hour">DST_M_F_S_Hour</dynamic> am - 
    <dynamic name="DST_M_F_E_Hour">DST_M_F_E_Hour</dynamic> pm. 
       </li> 
      </ul></text> 
    </body> 
    <body> 
     <text> 
       Thank you for your action. . 
      </text> 
    </body> 
    <body> 
     <text> 
      <dynamic name="C_D_N">C_D_N</dynamic> 
     </text> 
    </body> 
    <TextAndImage> 
     <text> 
      <dynamic name="C_S_N_D">C_S_N_D</dynamic> 
     </text> 
    </TextAndImage> 
    <dynamicNames> 
     <dynamicName>LOW</dynamicName> 
     <dynamicName>Env</dynamicName> 
    </dynamicNames> 
</Content> 

相反,如果你想將所有屬性屬性dynamic/@ name和otherElement/@值的值賦給元素主體,那麼以下內容將會執行:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
     <Content> 
      <xsl:apply-templates/> 
     </Content> 
    </xsl:template> 
    <xsl:template match="@*"> 
     <xsl:copy/> 
    </xsl:template> 
    <xsl:template match="* [local-name() != 'com' and local-name() != 'content' and local-name() != 'wire' and local-name() != 'sI']"> 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="node() | @*"/> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="* [local-name() = 'dynamic']"> 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="node() | @*[local-name !='name']"/> 
      <xsl:value-of select="@name"/> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="* [local-name() != 'dynamic' and @value]"> 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="node() | @*[local-name !='value']"/> 
      <xsl:value-of select="@value"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

與結果

<?xml version="1.0" encoding="UTF-8"?> 
<Content> 
    <aH> 
     <text>Ccc <dynamic>C_R_N</dynamic>: More</text> 
     <contact>false</contact> 
    </aH> 
    <page> 
     <nL>Please call us</nL> 
    </page> 
    <body> 
     <text> C R N: <strong> 
       <dynamic>C_R_N</dynamic> 
      </strong></text> 
    </body> 
    <body> 
     <text> 
       RE: <dynamic>D_C_P</dynamic><dynamic>M_C_O</dynamic></text> 
    </body> 
    <body> 
     <text> 
       In order <strong> 
       <dynamic>M_D_D</dynamic> 
      </strong>, we need some information. 
      </text> 
    </body> 
    <body> 
     <text><strong> 
       Please call us <dynamic>C_P_D_N</dynamic>. 
       </strong> Our hours <ul class="nested"> 
       <li> 
        Monday - Friday, 
    <dynamic>DST_M_F_S_Hour</dynamic> am - 
    <dynamic>DST_M_F_E_Hour</dynamic> pm; Saturday, 
    <dynamic>DST_M_F_S_Hour</dynamic> am - 
    <dynamic>DST_M_F_E_Hour</dynamic> pm. 
       </li> 
      </ul></text> 
    </body> 
    <body> 
     <text> 
       Thank you for your action. . 
      </text> 
    </body> 
    <body> 
     <text> 
      <dynamic>C_D_N</dynamic> 
     </text> 
    </body> 
    <TextAndImage> 
     <text> 
      <dynamic>C_S_N_D</dynamic> 
     </text> 
    </TextAndImage> 
    <dynamicNames> 
     <dynamicName>LOW</dynamicName> 
     <dynamicName>Env</dynamicName> 
    </dynamicNames> 
</Content> 
+0

你的代碼不會給我確切的輸出,我我期待的是,但它是有用的,我已經嘗試了相同的代碼。一旦在輸入xml上應用您的代碼,我會得到一箇中間的xml文件,我必須應用另一個xsl文件來獲得所需的輸出。所以我們最終得到了兩個需要轉換輸出的xsl文件。 – 2012-04-09 12:15:24

+0

我想設計一個單一的xsl文件(廣義的),其代碼不應該有任何輸入xml元素名稱的硬編碼,如果我們可以實現這一點,無論使用或不使用proerties文件對我來說都很好。並且轉換後的xml不應該包含實現給輸入xml文件的任何名稱空間,並且可能包含新的名稱空間。您可以參考轉換後的xml文件格式以供參考。謝謝。 – 2012-04-09 12:21:37

+0

編輯的代碼很酷。謝謝。 – 2012-04-09 14:04:42

0

我已通過採取由DavidCarlisle給出的代碼的幫助下,其部分地滿足的唯一問題IM在面對要求

 <?xml version="1.0"?> 
     <xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns="id:d1234" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     xmlns:w="http://do.way.com/sales/W" 
     xmlns:wire="http://do.way.com/sales/Wire"  
     exclude-result-prefixes=" wire w "> 

     <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
     <xsl:template match="/"> 
      <Content xsi:schemaLocation="id:d1234 http://abc:10/w/g/B/System/abc.xsd"> 
      <xsl:apply-templates select="w:sI"/> 
      </Content> 
     </xsl:template> 

     <xsl:template match="*[local-name()!=sI]"> 
      <xsl:variable name="n" select="name()"/> 
       <xsl:variable name="new"> 
       <xsl:for-each select="document('Properties.xml')"> 
       <xsl:choose> 
        <xsl:when test="key('n',$n)"> 
        <xsl:value-of select="key('n',$n)"/> 
        </xsl:when> 
        <xsl:otherwise> 
        <xsl:value-of select="$n"/> 
        </xsl:otherwise> 
       </xsl:choose> 
       </xsl:for-each> 
       </xsl:variable> 

     <xsl:element name="{$new}"> 
      <xsl:copy-of select="@*"/> 
      <xsl:apply-templates/> 
      </xsl:element> 
     </xsl:template> 


    <xsl:key name="n" match="Property" use="@value"/> 

     <xsl:template match="*[name() = 'dynamic']"> 
      <dynamic xmlns="http://www.w3.org/1999/xhtml"> 
       <xsl:copy-of select="@*"/> 
        <strong> 
       <xsl:value-of select="@name"/> 
      </strong> 
      </dynamic> 

     </xsl:template> 
    </xsl:stylesheet> 

所使用的下面的XSLT代碼這是我不能用一個xslt代碼來獲得,它可以使具有'value'屬性的節點(contact和dynamicName)提取它的屬性值,並將它們放在相應的標記(在Properties.xml中指定)內容下。 請通過這個xsl文件並對其進行必要的修改,否則我會同樣高興,如果你能想出一個新的。但請確保使用Properties.xml文件。謝謝。