2013-11-20 101 views
2

開放源代碼項目使用CMake來構建其項目文件。使用XSLT替換XML文件中的字符串

我不同意CMake - 這是一個10MB的安裝程序,可爲幾百KB的源創建批處理文件,甚至可以將開發者路徑硬編碼到輸出。它根本不會執行相對路徑,也不會使用Visual Studio提供的方便的宏。

所以我決定環顧四周。 Gyp看起來很有希望,但它又依賴於安裝了Python的用戶,這又回到了我不喜歡CMake的原因。至少它不會硬編碼路徑。

所以我想過使用批處理文件,以及簡單的查找和替換,但由於項目文件是xml爲什麼不是XSLT?所以在SO上搜索ran across this page,這似乎表明我想要在一個非常簡單的層面上做什麼。

所以我編輯的答案被Dimitre Novatchev以下幾點:

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

希望會發現下面並改變它:

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

但是沒有工作 - 使用VS2010 xslt調試器甚至不會在線上中斷。我不想花幾個月的時間學習如何正確使用XSLT,因爲這看起來很簡單。我需要的是我可以在28個xml文件中觸發並用它來完成的事情。

一旦我有這個工作,我會擴大它,以正確的值替換字段。

更新:這是整個XSLT:

<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

基於@Tim C的建議,如果有一個命名空間的問題,這是你如何解決這個問題。

假設這樣一個輸入文件(注意根命名空間聲明):

<?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元素,因爲它繼承了根的名稱空間。沒有命名空間的OutDir元素(這是您嘗試的)與具有命名空間的ms:OutDir不同 - 至少對於XSLT處理器而言。

+0

感謝Mathias。這工作。 –