使用XSLT替换XML文件中的字符串

时间:2013-11-20 13:39:28

标签: xml xslt

一个开源项目使用CMake来构建它的项目文件。

我不同意CMake - 这是一个10mb的安装程序,可以为几百kb的源创建批处理文件,即使这样,它也会将开发人员路径硬编码到输出中。它根本不做相对路径,也不使用Visual Studio提供的方便的宏。

所以我决定环顾四周。 Gyp看起来很有希望,但它再次依赖于安装了Python的用户,这又回到了我不喜欢CMake的原因。至少它不会硬编码路径。

所以我考虑使用批处理文件,并简单查找和替换,但由于项目文件是xml,为什么不使用XSLT?所以在这里搜索一下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>

1 个答案:

答案 0 :(得分: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元素,因为它继承了root的命名空间。没有命名空间的OutDir元素(这是你尝试过的)与ms:OutDir与命名空间不同 - 至少对于XSLT处理器而言。