通过引用删除元素

时间:2014-02-24 14:44:30

标签: xml xslt wix

使用Wix Toolset(版本3.8)实用程序收集来生成安装程序xml文件。我们想使用xslt选项删除包含其所有文件的文件夹以及对这些文件的任何引用。后半部分证明是困难的;

这是xml的一部分;

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
  <DirectoryRef Id="INSTALL_ROOT">
    <Directory Id="..." Name="MyCompany">
      <Directory Id=".." Name="doc">
        <Component Id="cmp20762D2CAD925E1B5974A3DD938BD5F3" Guid="..">
          <File Id=".." KeyPath="yes" Source="index.html" />
        </Component>
        <Component Id="cmp1BE839006D9CC9F26ECCBEE5894EFC33" Guid="...">
          <File Id=".." KeyPath="yes" Source="logo.jpg" />
        </Component>
      </Directory>
    </Directory>
  </DirectoryRef>
</Fragment>
<Fragment>
   <ComponentGroup Id="Features">
    <ComponentRef Id="cmp20762D2CAD925E1B5974A3DD938BD5F3" />
    <ComponentRef Id="cmp1BE839006D9CC9F26ECCBEE5894EFC33" />
  </ComponentGroup>
</Fragment>
</Wix>

使用这个xslt我可以删除包含子元素的“doc”字典但是如何删除引用子Component id属性的ComponentRef?

<?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:wix="http://schemas.microsoft.com/wix/2006/wi">

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

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

   <xsl:template match="wix:Directory[@Name='doc']" />
</xsl:stylesheet>

2 个答案:

答案 0 :(得分:1)

将以下模板添加到样式表中。如果有ComponentRef元素,其中属性Directory对应于“doc”且Name属性相同,则匹配Id元素。

<xsl:template match="wix:ComponentRef[@Id = //wix:Directory[@Name='doc']/wix:Component/@Id]"/>

这会从输入XML中删除ComponentRef个元素,因为它们的ID都显示在Directory[@Name='doc']中。

<强>样式表

<?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:wix="http://schemas.microsoft.com/wix/2006/wi">

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

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

   <xsl:template match="wix:Directory[@Name='doc']" />
   <xsl:template match="wix:ComponentRef[@Id = //wix:Directory[@Name='doc']/wix:Component/@Id]"/>
</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
   <Fragment>
      <DirectoryRef Id="INSTALL_ROOT">
         <Directory Id="..." Name="MyCompany"/>
      </DirectoryRef>
   </Fragment>
   <Fragment>
      <ComponentGroup Id="Features"/>
   </Fragment>
</Wix>

答案 1 :(得分:-3)

谢谢,这非常有帮助

最终解决方案包括双斜杠来处理带有子文件夹的doc文件夹。

   <xsl:template match="wix:ComponentRef[@Id = //wix:Directory[@Name='doc']//wix:Component/@Id]"/