2013-06-03 3 views
0

J'essaie d'utiliser WiX 3.7 pour produire un programme d'installation MSI. J'utilise heat.exe pour créer un fragment wxs à partir du contenu de mon répertoire de construction, que je référence ensuite dans un fichier wxs statique distinct. J'ai également besoin d'appliquer une transformation XSL à ce fichier afin d'ajouter un nœud "ServiceInstall" à l'un des composants. Ajouter le noeud est assez simple même pour un noob XSL comme moi. Cependant, pour que le XML résultant soit bien formé, je dois ajouter une référence à l'extension WixUtil à la fois au nœud Wix et au nœud Fragment. Donc, mon XML est la suivante:Ajouter un espace de noms au nœud en utilisant 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> 

Et je besoin d'être ceci:

<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> 

J'ajoute dynamiquement la déclaration d'espace de noms à l'élément Wix et qui fonctionne très bien, en utilisant le code suivant, empruntés à une autre réponse sur 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> 

Cependant, lorsque je tente d'utiliser la même méthode pour ajouter la déclaration au nœud Fragment, il retourne xml brouillées. Il semble que ce soit une tâche très simple et directe à accomplir. Qu'est-ce que je fais mal?

+0

Êtes-vous sûr que vous avez besoin de la déclaration 'xmlns: util = "http://schemas.microsoft.com/wix/UtilExtension"' deux fois? Sa présence sur l'élément racine devrait suffire. –

+0

Je supposais que ce serait - mais le nœud ne semble pas en hériter. Lorsque j'essaie de construire mon WixProj avec la déclaration ajoutée à l'élément racine mais pas à , je reçois ce qui suit: "L'élément Component contient un élément enfant inattendu" et le message "Impossible de trouver les informations de schéma pour l'attribut 'xyz'" messages. ETA - merci pour la réponse. –

Répondre

1

MISE À JOUR: L'espace de noms util n'est pas utilisé pour ServiceInstall. J'ai changé le XSL, mais j'ai laissé l'explication.

Un préfixe d'espace de nommage XML doit être défini uniquement dans les éléments dans lesquels il est utilisé ou dans un ancêtre. Le processeur XSL devrait le sortir dans un endroit approprié.

Faites-vous la transformation est en deux étapes? Cela ne devrait pas être nécessaire et pourrait être ce qui vous cause des problèmes.

Pour cette commande de chauffage, ce XSL fera l'entière modification dont vous avez discuté; Cependant, vous pourriez vouloir ajuster l'argument de la chaleur pour votre situation.

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> 
Questions connexes