2013-06-03 2 views
0

Я пытаюсь использовать 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. Похоже, это должно быть очень простой и простой задачей. Что я делаю не так?

+0

Вы уверены, что вам нужно заявление 'Xmlns: Util = "http://schemas.microsoft.com/wix/UtilExtension"' дважды? Его присутствие на корневом элементе должно быть достаточным. –

+0

Я предположил, что это будет - но узел , похоже, не наследует его. При попытке создать мой WixProj с объявлением, добавленным в корневой элемент, но не до , я получаю следующее: «Элемент Component содержит неожиданный дочерний элемент» и сопровождающий «Не удалось найти информацию о схеме для атрибута« xyz »» Сообщения. ETA - спасибо за ответ. –

ответ

1

UPDATE: Пространство имен util не используется для ServiceInstall. Я изменил XSL, но оставил объяснение.

Префикс пространства имен XML должен быть определен только в тех элементах, которые используются в предке или у него. Процессор XSL должен выводить его в подходящем месте.

Вы делаете преобразование, это два шага? Это не должно быть необходимым и может быть тем, что вызывает у вас проблемы.

Для этой команды тепла этот XSL выполнит всю измененную вами модификацию; Однако вы можете настроить аргумент жара для своей ситуации.

heat dir bin -out heated.wxs -t ServiceInstall.xsl -var var.mainDir 

ServiceInstall.xsl:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" 
    xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    exclude-result-prefixes="wix" 
    > 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="wix:Component[wix:File/@Source='$(var.mainDir)\some.exe']"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
     <wix:ServiceInstall 
      Id="xyz" 
      Type="ownProcess" 
      Vital="yes" 
      Name="someService" 
      DisplayName="someService" 
      Description="An example service." 
      etc="etc" /> 
    </xsl:copy> 
    </xsl:template> 

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

</xsl:stylesheet> 
Смежные вопросы