2012-11-06 2 views
1

확인. 나는XSL로 MSBuild 프로젝트에 포함 된 모든 파일의 목록을 얻을 수 있습니까?

<?xml version="1.0"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="PreBuild;Build;PostBuild;Deploy;PostDeploy;Test" > 

    <PropertyGroup> 
     <ApplicationName>application</ApplicationName> 
     <SolutionPath>C:\Projects\application\Solution\application.sln</SolutionPath> 
    </PropertyGroup> 

    <Import Project="$(SolutionPath)\SharedBuild.properties"/> 
    <Import Project="$(ApplicationName).properties"/> 
</Project> 

이 포함 된 프로젝트의 각 또한 프로젝트를 무한히을 포함 할 수있다 ...는 식으로 뭔가를 보이는 내 파일이 을 application.proj 있습니다. 그래서 드릴 다운하고 각 파일의 실제 경로를 얻는 방법을 원합니다.

XSL에서이 작업을 수행 할 수 있습니까? 아니면 C# 또는 다른 것으로 되돌려 야합니까?

감사합니다.

+0

이 답변이 도움이 될 것입니다 : http://stackoverflow.com/questions/13126707/get-all-included-stylesheets/13131428#13131428 –

답변

1

root.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<Project> 
    <PropertyGroup> 
    <ApplicationName>application</ApplicationName> 
    </PropertyGroup> 

    <Import Project="project1.xml"/> 
    <Import Project="project2.xml"/> 
</Project> 

project1.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<Project> 
    <PropertyGroup> 
    <ApplicationName>project1</ApplicationName> 
    </PropertyGroup> 
    <Import Project="project3.xml"/> 
</Project> 

project2.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<Project> 
    <PropertyGroup> 
    <ApplicationName>project2</ApplicationName> 
    </PropertyGroup> 
</Project> 

project3.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<Project> 
    <PropertyGroup> 
    <ApplicationName>project3</ApplicationName> 
    </PropertyGroup> 
</Project> 

그러면 이것은 일종의 것일까요? root.xml에 대해 실행

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    version="2.0"> 

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 
    <projects> 
     <!--<xsl:sequence select="test:project(document-uri(.), /Project)" />--> 
     <xsl:apply-templates select="/Project"> 
     <xsl:with-param name="cur-path" select="document-uri(.)" /> 
     </xsl:apply-templates> 
    </projects> 
    </xsl:template> 

    <xsl:template match="Project"> 
    <xsl:param name="cur-path" as="xs:anyURI" /> 
    <project path="{$cur-path}"> 
     <name><xsl:value-of select="//ApplicationName" /></name> 
    </project> 
    <xsl:for-each select="//Import"> 
     <xsl:variable name="path" select="resolve-uri(@Project, $cur-path)" /> 
     <xsl:apply-templates select="document(@Project)/Project"> 
     <xsl:with-param name="cur-path" select="$path" /> 
     </xsl:apply-templates> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

이 제공 :

<?xml version="1.0" encoding="UTF-8"?> 
<projects xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:test="urn:test"> 
    <project path="file:/C:/Dropbox/Public/xsl/recursive/root.xml"> 
     <name>application</name> 
    </project> 
    <project path="file:/C:/Dropbox/Public/xsl/recursive/project1.xml"> 
     <name>project1</name> 
    </project> 
    <project path="file:/C:/Dropbox/Public/xsl/recursive/project3.xml"> 
     <name>project3</name> 
    </project> 
    <project path="file:/C:/Dropbox/Public/xsl/recursive/project2.xml"> 
     <name>project2</name> 
    </project> 
</projects> 
+0

답변 해주셔서 감사합니다. C#에서 끝내기까지는 결국 전체 경로와 상대 경로가 매우 복잡해졌으며 상대 경로는 include라는 파일과 관련이 있습니다. 하지만 이것은 훌륭한 대답처럼 보입니다 ... 고마워. – gorf

+0

그래서 나는'curl-path를 설정하기 위해'resolve-uri ($ relative, $ base)'를 사용했다. 절대 URI와 상대 URI를 결합하여 처리해야한다. 'document()'호출은 실제로 절대 URI도 취할 수 있습니다. http://www.xsltfunctions.com/xsl/fn_resolve-uri.html을 참조하십시오. – spiralx

관련 문제