Как добавить условие к компоненту во время преобразования xsl?

Я пытаюсь добавить условие компонента в wix во время преобразования xsl, которое применяется при сборе каталога. Я попробовал этот шаблон, но он не работает.

<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 будет выполняться с помощью тепла вместе с преобразованием, я думаю, что промежуточный 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. Пожалуйста, предложите.


person Sameer    schedule 14.04.2016    source источник
comment
Пожалуйста, покажите нам пример ввода и ожидаемого результата — см.: минимально воспроизводимый пример.   -  person michael.hor257k    schedule 14.04.2016
comment
@ michael.hor257k: добавил пример ввода и ожидаемого результата   -  person Sameer    schedule 14.04.2016
comment
Ваш ввод не находится в пространстве имен wix:, поэтому ваш шаблон ничему не соответствует.   -  person michael.hor257k    schedule 14.04.2016
comment
Я добавил пространство имен.   -  person Sameer    schedule 14.04.2016
comment
Смотрите мой отредактированный ответ.   -  person michael.hor257k    schedule 14.04.2016


Ответы (1)


— отредактировано в ответ на уточнение—

Не уверен, что вы подразумеваете под "не работает". Конечно, вы должны поместить новый элемент в то же пространство имен, что и его родитель, чтобы получить ожидаемый результат:

XSLT 1.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>

Посмотрите, как это работает: http://xsltransform.net/bFN1yai

person michael.hor257k    schedule 14.04.2016
comment
Я не знал правила пространств имен, поэтому вывод каким-то образом засорялся всеми различными пространствами имен. В любом случае, спасибо за решение. - person Sameer; 14.04.2016
comment
значение не упаковывается в CDATA Это происходит в моей демонстрации. Вы точно его скопировали, особенно атрибут cdata-section-elements? - person michael.hor257k; 14.04.2016
comment
да, я сделал это .. хотя это не проблема, у меня есть обходной путь .. ‹xsl:text disable-output-escaping=yes›![CDATA[‹/xsl:text› Я добавил это на данный момент - person Sameer; 14.04.2016
comment
Вы не должны использовать такой хак, но если ваш процессор XSLT не соответствует спецификациям... - person michael.hor257k; 14.04.2016
comment
Вау! Какой классный ответ! Это именно то, что мне нужно. Рабочий пример был очень полезен, чтобы быстро определить, действительно ли преобразование будет работать для моего сценария. - person afournier; 01.10.2020