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?
Ê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. –
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. –