Xml 如何在xsl转换期间向组件添加条件?

Xml 如何在xsl转换期间向组件添加条件?,xml,xslt,heat,Xml,Xslt,Heat,我试图在获取目录期间应用的xsl转换期间在wix中添加组件条件。我尝试了这个模板,但它不工作 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msx

我试图在获取目录期间应用的xsl转换期间在wix中添加组件条件。我尝试了这个模板,但它不工作

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                exclude-result-prefixes="msxsl"
                xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
                xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
                xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <xsl:output method="xml" indent="yes" />

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


  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="wix:Component">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
         <Condition Level="1"><![CDATA[MYPROP="1"]]></Condition>
    </xsl:copy>
  </xsl:template>

虽然heat.exe的输入将是目录位置,xml生成将由heat和转换一起完成,但我认为作为输入的中间xml将是

输入

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="MyDir">
            <Component Id="CefSharp.BrowserSubprocess.Core.dll_x86" Guid="06CF68DB-C4D3-45D3-8619-982C7963ADC6">
                <File Id="CefSharp.BrowserSubprocess.Core.dll_x86" KeyPath="yes" Source="$(var.CefSharpDirx86)\CefSharp.BrowserSubprocess.Core.dll" />

            </Component>

        </DirectoryRef>
    </Fragment>
</Wix>

输出

 <?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

         <Fragment>
                <DirectoryRef Id="MyDir">
                    <Component Id="CefSharp.BrowserSubprocess.Core.dll_x86" Guid="06CF68DB-C4D3-45D3-8619-982C7963ADC6">
                        <File Id="CefSharp.BrowserSubprocess.Core.dll_x86" KeyPath="yes" Source="$(var.CefSharpDirx86)\CefSharp.BrowserSubprocess.Core.dll" />
                      <Condition Level="1"><![CDATA[MYPROP="1"]]></Condition>
                    </Component>

                </DirectoryRef>
            </Fragment>
    </Wix>

我是XSLT领域的新手。请提出建议。

--为回应澄清而编辑--

不知道你说的“不工作”是什么意思。当然,您必须将新元素与其父元素放在同一命名空间中,才能获得预期的结果:

XSLT1.0

<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" cdata-section-elements="wix:Condition"/>
<xsl:strip-space elements="*" />

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

<xsl:template match="wix:Component">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:element name="Condition" namespace="http://schemas.microsoft.com/wix/2006/wi">
            <xsl:attribute name="level">1</xsl:attribute>
            <xsl:text>MYPROP="1"</xsl:text>
        </xsl:element>  
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

1.
MYPROP=“1”
查看它是否正常工作:

--根据澄清进行编辑--

不知道你说的“不工作”是什么意思。当然,您必须将新元素与其父元素放在同一命名空间中,才能获得预期的结果:

XSLT1.0

<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" cdata-section-elements="wix:Condition"/>
<xsl:strip-space elements="*" />

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

<xsl:template match="wix:Component">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:element name="Condition" namespace="http://schemas.microsoft.com/wix/2006/wi">
            <xsl:attribute name="level">1</xsl:attribute>
            <xsl:text>MYPROP="1"</xsl:text>
        </xsl:element>  
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

1.
MYPROP=“1”


查看其工作情况:

请向我们展示输入示例和预期输出-请参阅:。@michael.hor257k:已添加输入示例和预期输出您的输入不在
wix:
命名空间中,因此,您的模板与任何内容都不匹配。我已添加了名称空间。请查看我编辑的答案。请向我们展示输入示例和预期输出-请参见:。@michael.hor257k:已添加输入示例和预期输出您的输入不在
wix:
名称空间中,因此,您的模板与任何内容都不匹配。我已添加了名称空间。请参阅我编辑的答案。我不知道名称空间的规则,因此有些人知道输出如何与所有不同的名称空间混在一起。无论如何..感谢解决方案..转换正在工作,但在我的示例中,值没有包装到CDATA中。“值没有包装到CDATA中”它在我的中有。您是否准确地复制了它-特别是
CDATA节元素
属性?是的,我复制了。虽然这不是一个问题,但我有一个解决方法。[CDATA][我现在已经添加了这一点,您不应该使用这种破解-但是如果您的XSLT处理器不符合规范…哇!这是一个多么棒的答案!这正是我所需要的。工作示例非常有助于快速确定转换是否真的适用于我的场景。我不知道名称空间的规则,所以有些人如何输出被所有不同的名称空间弄得乱七八糟..无论如何..感谢您的解决方案..转换正在工作,但在我的例子中,值没有包装到CDATA中。“值没有包装到CDATA中。”“在我的中是这样的。您是否准确地复制了它-特别是
cdata节元素
属性?是的,我复制了。虽然这不是一个问题,但我有一个解决办法。![cdata[我已经添加了这一点,现在你不应该使用这种黑客-但是如果你的XSLT处理器不符合规范…哇!多么棒的回答!这正是我所需要的。工作示例非常有助于快速确定转换是否确实适用于我的场景。