xml – 通过应用xslt tranfsormation从wxs文件中删除不需要的节点

前端之家收集整理的这篇文章主要介绍了xml – 通过应用xslt tranfsormation从wxs文件中删除不需要的节点前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图通过应用xml转换来清理heat.exe生成的wxs文件.

下面是heat.exe的示例文件输出.

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  3. <Fragment>
  4. <DirectoryRef Id="APPFOLDER">
  5. <Component Id="cmp78E9FF58917B1844F3E9315A285F3147" Guid="SOME-GUID">
  6. <File Id="fil093D6D7CB723B5B62730D7B4E575F154" KeyPath="yes" Source="PQR.Some.dll" />
  7. </Component>
  8. <Component Id="cmp0B084126FAE7577FD84DB29766AC6C2B" Guid="SOME-GUID">
  9. <File Id="filB20C8708D7EB02EDFBCC4D70F9FE7F8A" KeyPath="yes" Source="ABC.Another.dll" />
  10. </Component>
  11. <Component Id="cmp83BB1954DECD7D949AAE4ACA68806EC3" Guid="SOME-GUID">
  12. <File Id="fil0E29FBFF7DB39F307A2EE19237A0A579" KeyPath="yes" Source="ABC.OneMore.dll" />
  13. </Component>
  14. </DirectoryRef>
  15. </Fragment>
  16. <Fragment>
  17. <ComponentGroup Id="AppFiles">
  18. <ComponentRef Id="cmp78E9FF58917B1844F3E9315A285F3147" />
  19. <ComponentRef Id="cmp0B084126FAE7577FD84DB29766AC6C2B" />
  20. <ComponentRef Id="cmp83BB1954DECD7D949AAE4ACA68806EC3" />
  21. </ComponentGroup>
  22. </Fragment>
  23. </Wix>

我想删除其子文件节点具有包含字符串’ABC’的Source属性的Component节点.我知道如何使用正确的匹配模式找到这样的节点.
因此,在删除Component节点之前,我想存储组件的Id,然后使用它来删除我刚刚记录的Id的ComponentRef节点.

有没有办法通过XML转换实现这一目标?我想我正在寻找一些可以创建变量的东西,说’X’来存储我删除的组件节点的Id,并使用’X’来查找要删除的ComponentRef节点.

你可以没有变量地做到这一点.像这样:
  1. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  2. xmlns:wi="http://schemas.microsoft.com/wix/2006/wi">
  3. <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  4. <xsl:strip-space elements="*"/>
  5. <xsl:key name="kCompsToRemove"
  6. match="wi:Component[contains(wi:File/@Source,'ABC')]"
  7. use="@Id" />
  8.  
  9. <xsl:template match="@* | node()">
  10. <xsl:copy>
  11. <xsl:apply-templates select="@* | node()"/>
  12. </xsl:copy>
  13. </xsl:template>
  14.  
  15. <xsl:template match="*[self::wi:Component or self::wi:ComponentRef]
  16. [key('kCompsToRemove',@Id)]" />
  17. </xsl:stylesheet>

在样本输入上运行时,会产生:

  1. <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  2. <Fragment>
  3. <DirectoryRef Id="APPFOLDER">
  4. <Component Id="cmp78E9FF58917B1844F3E9315A285F3147" Guid="SOME-GUID">
  5. <File Id="fil093D6D7CB723B5B62730D7B4E575F154" KeyPath="yes" Source="PQR.Some.dll" />
  6. </Component>
  7. </DirectoryRef>
  8. </Fragment>
  9. <Fragment>
  10. <ComponentGroup Id="AppFiles">
  11. <ComponentRef Id="cmp78E9FF58917B1844F3E9315A285F3147" />
  12. </ComponentGroup>
  13. </Fragment>
  14. </Wix>

猜你在找的XML相关文章