XSLT:基于含有特定字符串的子属性值于母公司添加属性(XSLT: Add Attribute to

2019-10-21 01:40发布

我使用的维克斯安装收获的文件的文件XSLT转换。 我想,以纪念特定的目录作为永久的所有文件。 为了做到这一点,我必须做一个包含看看文件夹名称为源属性。 下面是其中一个节点,然后变换。 任何帮助将不胜感激。

<Component Id="cmpE4293ADC65367393D7A7630023A43F89" Directory="dirAFEA15D2A28EA2E6080FAD1EE1935E0A" Guid="{691DB98F-E5F4-4979-B2E5-63E14AF8A328}">
      <File Id="filE11EC7DCDC230815BECFE0925B1F3DC4" KeyPath="yes" Source="$(var.publishDir)\WebConfig\appSettings.config" />
 </Component>

<?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"
    xmlns="http://schemas.microsoft.com/wix/2006/wi"
    xmlns:msxml="urn:schemas-microsoft-com:xslt"
    exclude-result-prefixes="wix">

  <xsl:template match="wix:Wix">
    <xsl:copy>
      <xsl:apply-templates select="@*" />
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="wix:Component">

    <!-- Just copy the tag itself -->
    <xsl:copy>

      <xsl:variable name="fvsys" >
        <xsl:value-of select="node()/File/@Source"/>
      </xsl:variable>
      <!-- Copy all attributes -->
      <xsl:apply-templates select="@*" />

      <!-- Here comes the distinction: if you find our special component, do some special things -->
      <xsl:choose>
        <!-- Note that the string is translated to all lower case, so you don't have to care about being case sensitive or not -->
        <xsl:when test="contains($fvsys, 'WebConfig')">
          <!-- Here we will add the Permanent-attribute to this very special component -->
          <xsl:attribute name="Permanent">yes</xsl:attribute>
        </xsl:when>
      </xsl:choose>
       <xsl:choose>
        <!-- Note that the string is translated to all lower case, so you don't have to care about being case sensitive or not -->
        <xsl:when test="contains($fvsys, 'DocumentConversions')">
          <!-- Here we will add the Permanent-attribute to this very special component -->
          <xsl:attribute name="Permanent">yes</xsl:attribute>
        </xsl:when>
      </xsl:choose>


      <!-- Now take the rest of the inner tag -->
      <xsl:apply-templates select="node()" />
    </xsl:copy>

  </xsl:template>

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

</xsl:stylesheet>

Answer 1:

我假设你要添加的PermanentComponent节点,而不是在File的节点?

如果是这样,问题是你如何定义fvsys变量:

  <xsl:variable name="fvsys" >
    <xsl:value-of select="node()/File/@Source"/>
  </xsl:variable>

这里有两个问题。 首先,因为你已经定位在对Component节点,这将是寻找一个File这是一个“大孩子”,而不是直接的子节点。 其次,它看起来像File节点也是一部分wix命名空间,因此还需要包括前缀。

试试这个

  <xsl:variable name="fvsys" select="wiz:File/@Source" />

注意使用的select的变量本身。 在原来的版本中,你创建的属性值的副本,但在后者的声明中它仍然是直接引用的属性。



Answer 2:

感谢您的回答我刚刚发现一个在这里工作是我的改造,这个工作对我的需要。 它标志着一个文件夹内的永久性每个文件。

<?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"
    xmlns="http://schemas.microsoft.com/wix/2006/wi"
    xmlns:msxml="urn:schemas-microsoft-com:xslt"
    exclude-result-prefixes="wix">

  <xsl:template match="wix:Wix">
    <xsl:copy>
      <xsl:apply-templates select="@*" />
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="wix:Component">

    <!-- Just copy the tag itself -->
    <xsl:copy>

      <xsl:variable name="fvsys" >
        <xsl:value-of select="*[local-name()='File']/@Source"/>
      </xsl:variable>
      <!-- Copy all attributes -->
      <xsl:apply-templates select="@*" />

      <!-- This will mark all files in the WebConfig folder as permanent -->
      <xsl:choose>
        <!-- Note that the string is translated to all lower case, so you don't have to care about being case sensitive or not -->
        <xsl:when test="contains($fvsys, 'WebConfig\')">
          <!-- Here we will add the Permanent-attribute to this very special component -->
          <xsl:attribute name="Permanent">yes</xsl:attribute>
        </xsl:when>
      </xsl:choose>
       <xsl:choose>
        <!-- This will mark all files in the DocumentConversions folder as permanent -->
        <xsl:when test="contains($fvsys, 'DocumentConversions\')">
          <!-- Here we will add the Permanent-attribute to this very special component -->
          <xsl:attribute name="Permanent">yes</xsl:attribute>
        </xsl:when>
      </xsl:choose>


      <!-- Now take the rest of the inner tag -->
      <xsl:apply-templates select="node()" />
    </xsl:copy>

  </xsl:template>

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

</xsl:stylesheet>


文章来源: XSLT: Add Attribute to parent based on child attribute value containing a specific string
标签: xslt wix wix3.5