Xml 如何在xsl转换期间向组件添加条件?
我试图在获取目录期间应用的xsl转换期间在wix中添加组件条件。我尝试了这个模板,但它不工作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: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处理器不符合规范…哇!多么棒的回答!这正是我所需要的。工作示例非常有助于快速确定转换是否确实适用于我的场景。