2012-06-07 121 views
1

我試圖用xmlstarlet對一大羣的.NET項目文件的工作,但嘗試使用XSL來去除ProductVersion不工作這個簡單的變換。xmlstarlet XSLT轉換未能刪除節點

我已經試過//ProductVersion,可在這種情況下,命名空間是造成問題?

run.cmd

SET ProjFile=test.vbproj 
SET TempFile=%TEMP%\temp.proj 
xml tr clean.xsl %ProjFile% > %TempFile% 
move /Y %TempFile% %ProjFile% 

clean.xsl

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="ProductVersion"/> 
</xsl:stylesheet> 

test.vbproj

<?xml version="1.0" encoding="UTF-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0"> 
    <PropertyGroup> 
    <ProductVersion>9.0.30729</ProductVersion> 
    <SchemaVersion>2.0</SchemaVersion> 
    </PropertyGroup> 
</Project> 

回答

1

您可以用xmlstarlet編輯子直接做到這一點:

xmlstarlet ed \ 
    -N ms=http://schemas.microsoft.com/developer/msbuild/2003 \ 
    -d '//ms:ProductVersion' test.vbproj 

或者,你可以修改你的XSLT尊重命名空間:

<?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 method="xml" version="1.0" encoding="UTF-8" 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:ProductVersion"/> 
</xsl:stylesheet>