2011-01-26 53 views
1

我正在尝试使用XSLT重新映射XML文件,但我不熟悉XSLT如何执行此过程。基本上我需要以下XML转换:使用XSLT将XML文档重新映射到新的XML文件

<rows> 
<row> 
<site id>My Website</site id> 
<pageName>Homepage</pageName> 
<channel>microsite</channel> 
<tree>mywebsite/subsite/homepage</tree> 
<url name>brand name</url name> 
<urltype>2</urltype> 
<spec4>{lang}</spec4> 
<spec6>company:section:homepage</spec6> 
<spec11>ms:plinth</spec11> 
<spec12>2010</spec12> 
<spec14>company-{country}</spec14> 
<spec15>site:brand name</spec15> 
<spec16>Brand Name</spec16> 
<spec18></spec18> 
<spec30>site:brand name</spec30> 
<add4>{lang}</add4> 
<add5>ref:company</add5> 
<add6>company:section:homepage</add6> 
<add11>ms:plinth</add11> 
<add12>2010</add12> 
<add14>company-{country}</add14> 
<add15>site:brand name</add15> 
<add16>Brand Name</add16> 
<add30>site:brand name</add30> 
<actions4>action 1</actions4> 
<actions5>action 3</actions5> 
</row> 
</rows> 

进入结构更好的一个:

<siteSpecific> 
<site id="My Website" urlType="page"> 
    <general> 
    <pageName>ms:sbe:Brand Name:tdr</pageName> 
    <channel>microsite</channel> 
    <tree>mywebsite/subsite/homepage</tree> 
    <urlName>referral:brand</urlName> 
    <urlType>2</urlType> 
    </general> 
    <specs> 
    <spec4>{lang}</spec4> 
    <spec6>company:section:homepage</spec6> 
    <spec11>ms:plinth</spec11> 
    <spec12>2010</spec12> 
    <spec14>company-{country}</spec14> 
    <spec15>site:brand name</spec15> 
    <spec16>Brand Name</spec16> 
    <spec30>site:brand name</spec30> 
    </specs> 
    <adds> 
    <add4>{lang}</add4> 
    <add5>ref:company</add5> 
    <add6>company:section:homepage</add6> 
    <add11>ms:plinth</add11> 
    <add12>2010</add12> 
    <add14>company-{country}</add14> 
    <add15>site:brand name</add15> 
    <add16>Brand Name</add16> 
    <add30>site:brand name</add30> 
    </adds> 
    <actions> 
    <actions4>action 1</actions4> 
    <actions5>action 3</actions5> 
    </actions> 
</site> 
</siteSpecific> 

任何人都可以点我在正确的方向?我看过类似的帖子,但这些帖子都很老旧,而且由于XSLT似乎没有用于这个目的,所以现在我也在想这是不是最好的选择?

回答

2

XML中不允许使用像site id这样的名称,所以我必须对输入XML做出一些假设。假设它是

<rows> 
<row> 
<site_id>My Website</site_id> 
<pageName>Homepage</pageName> 
<channel>microsite</channel> 
<tree>mywebsite/subsite/homepage</tree> 
<url_name>brand name</url_name> 
<urltype>2</urltype> 
<spec4>{lang}</spec4> 
<spec6>company:section:homepage</spec6> 
<spec11>ms:plinth</spec11> 
<spec12>2010</spec12> 
<spec14>company-{country}</spec14> 
<spec15>site:brand name</spec15> 
<spec16>Brand Name</spec16> 
<spec18></spec18> 
<spec30>site:brand name</spec30> 
<add4>{lang}</add4> 
<add5>ref:company</add5> 
<add6>company:section:homepage</add6> 
<add11>ms:plinth</add11> 
<add12>2010</add12> 
<add14>company-{country}</add14> 
<add15>site:brand name</add15> 
<add16>Brand Name</add16> 
<add30>site:brand name</add30> 
<actions4>action 1</actions4> 
<actions5>action 3</actions5> 
</row> 
</rows> 

然后样式表

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

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

    <xsl:template match="row"> 
    <site id="{site_id}" urlType="page"> 
     <general> 
     <xsl:apply-templates select="pageName | channel | tree | url_name | urltype"/> 
     </general> 
     <specs> 
     <xsl:apply-templates select="*[starts-with(local-name(), 'spec')]"/> 
     </specs> 
     <adds> 
     <xsl:apply-templates select="*[starts-with(local-name(), 'add')]"/> 
     </adds> 
     <actions> 
     <xsl:apply-templates select="*[starts-with(local-name(), 'action')]"/> 
     </actions> 
    </site> 
    </xsl:template> 

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

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

</xsl:stylesheet> 

创建以下输出:

<siteSpecific> 
    <site id="My Website" urlType="page"> 
     <general> 
     <pageName>Homepage</pageName> 
     <channel>microsite</channel> 
     <tree>mywebsite/subsite/homepage</tree> 
     <urlName>brand name</urlName> 
     <urlType>2</urlType> 
     </general> 
     <specs> 
     <spec4>{lang}</spec4> 
     <spec6>company:section:homepage</spec6> 
     <spec11>ms:plinth</spec11> 
     <spec12>2010</spec12> 
     <spec14>company-{country}</spec14> 
     <spec15>site:brand name</spec15> 
     <spec16>Brand Name</spec16> 
     <spec18/> 
     <spec30>site:brand name</spec30> 
     </specs> 
     <adds> 
     <add4>{lang}</add4> 
     <add5>ref:company</add5> 
     <add6>company:section:homepage</add6> 
     <add11>ms:plinth</add11> 
     <add12>2010</add12> 
     <add14>company-{country}</add14> 
     <add15>site:brand name</add15> 
     <add16>Brand Name</add16> 
     <add30>site:brand name</add30> 
     </adds> 
     <actions> 
     <actions4>action 1</actions4> 
     <actions5>action 3</actions5> 
     </actions> 
    </site> 
</siteSpecific> 
+0

1为一个很好的解决方案。 – Flack 2011-01-26 11:55:15