2012-04-09 84 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文件。谢谢。