Я пытаюсь использовать WiX 3.7 для создания установщика MSI. Я использую heat.exe для создания фрагмента wxs из содержимого моего каталога сборки, который затем ссылаюсь в отдельном статическом файле wxs. Мне также необходимо применить преобразование XSL в этот файл, чтобы добавить узел «ServiceInstall» к одному из компонентов. Добавление узла довольно просто даже для XSL noob, подобного мне. Однако, чтобы результирующий XML был хорошо сформирован, мне нужно добавить ссылку на расширение WixUtil как на узел Wix, так и на узел Fragment. Итак, мой XML заключается в следующем:Добавить пространство имен в узел с помощью XSL
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="Main">
<Component Id="xyz" Guid="{123}">
<File Id="xyz" KeyPath="yes" Source="$(var.mainDir)\some.exe" />
<util:ServiceInstall Id="xyz" Type="ownProcess" Vital="yes" Name="someService" DisplayName="someService" Description="An example service." etc="etc" />
</Component>
</DirectoryRef>
</Fragment>
</Wix>
И мне нужно, чтобы это было так:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Fragment xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<DirectoryRef Id="Main">
<Component Id="xyz" Guid="{123}">
<File Id="xyz" KeyPath="yes" Source="$(var.mainDir)\some.exe" />
<util:ServiceInstall Id="xyz" Type="ownProcess" Vital="yes" Name="someService" DisplayName="someService" Description="An example service." etc="etc" />
</Component>
</DirectoryRef>
</Fragment>
</Wix>
Я динамически добавлять объявления пространства имен к элементу Wix и что работает отлично, используя следующий код, заимствованные из другого ответа на StackOverflow:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:old="http://schemas.microsoft.com/wix/2006/wi"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
exclude-result-prefixes="old">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pNewNamespace" select="'http://schemas.microsoft.com/wix/2006/wi'"/>
<xsl:variable name="vXsi" select="document('')/*/namespace::*[name()='util']"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
Однако, когда я пытаюсь использовать тот же метод, чтобы добавить объявление в узел фрагмента, он возвращает искаженные XML. Похоже, это должно быть очень простой и простой задачей. Что я делаю не так?
Вы уверены, что вам нужно заявление 'Xmlns: Util = "http://schemas.microsoft.com/wix/UtilExtension"' дважды? Его присутствие на корневом элементе должно быть достаточным. –
Я предположил, что это будет - но узел, похоже, не наследует его. При попытке создать мой WixProj с объявлением, добавленным в корневой элемент, но не до , я получаю следующее: «Элемент Component содержит неожиданный дочерний элемент» и сопровождающий «Не удалось найти информацию о схеме для атрибута« xyz »» Сообщения. ETA - спасибо за ответ. –