实际上是将vs7.1的工程文件(*.vcproj)到编辑器Programmer's Notepad的工程文件(*.pnproj)转换,所需的工作量是很小的。
最近要做毕设,需要查看eMule的源代码,但本人机了太烂没装vs200X,于是想转换到Programmer's Notepad中的工程文件来查看。eMule源代码中有大量的文件,想一个个地添加到太麻烦了,好在它们的工程文件都是xml格式的,使用xslt来软件就很容易了。
PNotepad的工程文件格式很简单,根节点为Project,里面依次为Folder/File,都使用属性来表示相关信息。一示例如下:
- <Project name="hello">
- <Folder name="New Folder">
- <File path="AbstractFile.h"></File>
- <File path="3DPreviewControl.h"></File>
- <File path="AbstractFile.cpp"></File>
- <File path="3DPreviewControl.cpp"></File>
- </Folder>
- </Project>
而在vs工程文件*.vcproj中需要关注的结点是VisualStudioProject/Files,所有文件名就存放该标签里。Files下是用Filter来代表各个文件夹,其下的File标签就代表一个文件了。它们有如下简单的对应关系:
*.vcproj | *.pnproj
<VisualStudioProject name=""> |
<
Project
name
=
"hello"
>
<Files> |
<Filter name=""> |
<
Folder
name
=
"New Folder"
>
<File RelativePath=""> |
<
File
path
=
"AbstractFile.h"
>
一个xsl文件如下:
- <?xml version="1.0" encoding="utf-8"?>
- <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
- <xsl:output method="text" />
- <xsl:template match="/">
- <Project>
- <xsl:attribute name="name"><xsl:value-of select="VisualStudioProject/@Name" /></xsl:attribute>
- <xsl:apply-templates select="VisualStudioProject/Files/Filter" />
- </Project>
- </xsl:template>
- <xsl:template match="Filter">
- <Folder>
- <xsl:attribute name="name"><xsl:value-of select="@Name" /></xsl:attribute>
- <xsl:apply-templates select="File" />
- </Folder>
- </xsl:template>
- <xsl:template match="File">
- <File><xsl:attribute name="path">srchybrid/<xsl:value-of select="@RelativePath" /></xsl:attribute></File>
- </xsl:template>
- </xsl:stylesheet>
需要注意的是使用浏览器进行转换时并不能看到转换后的结果,最好使用能转换xml格式的编辑器。我使用的是SharpDevelop,它是一个开源的C# IDE工具,带有xml编辑器,且提供xsl转换功能。将vs工程文件的vcproj后缀改为xml后用
SharpDevelop打开,这时主菜单中会出一个xml菜单,其中“Assign XSLT”指定xsl文件,“Run XSLT”进行转换,转换结果会在一个新的窗口中显示出来。
这个转换文件有一个问题是,需要考虑文件的相对位置,这可能也要在xsl文件中体现出来。上面代码中第19行最后
srchybrid/就是一个相对路径。