2013-11-20 7 views
2

오픈 소스 프로젝트는 CMake을 사용하여 프로젝트 파일을 빌드합니다.XSLT를 사용하여 XML 파일의 문자열 바꾸기

나는 CMake와 동의하지 않는다. 그것은 수백 킬로바이트 소스에 대한 배치 파일을 생성하기위한 10MB 설치 프로그램이며 개발자 경로를 출력에 하드 코드한다. 상대 경로를 전혀 사용하지 않으며 Visual Studio에서 제공하는 편리한 매크로도 사용하지 않습니다.

그래서 주위를 둘러보기로했습니다. Gyp은 유망 해 보였지만 파이썬이 설치되어있는 사용자에게 의존하고 있으며 CMake를 싫어하는 이유이기도합니다. 최소한 경로를 하드 코딩하지는 않습니다.

그래서 배치 파일을 사용하고 간단한 찾기 및 바꾸기를 생각했지만 프로젝트 파일은 xml이 아니기 때문에 XSLT입니까? 그래서 여기에있는 ran across this page의 검색은 내가 아주 단순한 수준에서하고 싶은 것을 보여주는 것처럼 보였습니다. 그 다음를 찾아 변경 것이라고 기대

<xsl:template match="OutDir/text()"> 
    <xsl:text>Diferent text</xsl:text> 
</xsl:template> 

:

그래서 나는 다음에 Dimitre Novatchev에 의해 답을 편집 작동하지 않았다

그러나
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">U:\unittest-cpp-pj\vs_projects\vs2012_x86\Debug\</OutDir> 

- VS2010를 사용하여 xslt 디버거는 줄을 어지럽히 지 않습니다. XSLT를 올바르게 사용하는 방법을 배우는 데 몇 달을 보내고 싶지 않습니다. 내가 필요한 것은 28 xml 파일에서 실행할 수 있고 그걸로 끝낼 수있는 것입니다.

이 작업을 완료하면 필드를 올바른 값으로 바꾸기 위해 확장합니다.

업데이트는 : 네임 스페이스 문제가있는 경우 @ 팀 C의 제안을 바탕으로

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="OutDir/text()"> 
    <xsl:text>Diferent text</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 
+0

입력 XML과 원하는 출력 XML을 더 게시 할 수 있습니까? 우리는 더 많은 맥락이 필요합니다. –

+2

이것은 아마도 네임 스페이스 때문일 수 있습니다. XML의 루트 요소에'xmlns = "http://schemas.microsoft.com/developer/msbuild/2003"와 같은 명령문이 있습니까? –

+0

이것이 유일한 템플릿 일 경우 사용하지 않을 것입니다. 따라서 모든 XSLT 코드를 보여줄 수 있다면 도움이 될 것입니다. 그러면 기꺼이 도와 드리겠습니다. –

답변

1

, 이것은 당신이 그것을 해결할 수있는 방법입니다 : 이것은 전체 XSLT이다.

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

<root xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <other/> 
    <other/> 
    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">U:\unittest-cpp-pj\vs_projects\vs2012_x86\Debug\</OutDir> 
    <other/> 
</root> 

사용이 스타일 시트 (나는 다른 네임 스페이스 "MS"를 선언 한 점에 유의) :

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

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ms="http://schemas.microsoft.com/developer/msbuild/2003"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="ms:OutDir/text()"> 
    <xsl:text>Different text</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

이 같은 입력 파일 (루트에있는 네임 스페이스 선언을 참고)을 가정

OutDir 요소는 루트의 네임 스페이스를 상속하기 때문에 catch하지 않았습니다. 네임 스페이스가없는 OutDir 요소 (시도한 것)는 적어도 XSLT 프로세서의 경우 네임 스페이스가있는 ms : OutDir과 다릅니다.

+0

고마워요. 그게 효과가 있었어. –

관련 문제