1

WiX 3.7 を使用して MSI インストーラーを作成しようとしています。heat.exe を使用してビルド ディレクトリの内容から wxs フラグメントを作成し、それを別の静的 wxs ファイルで参照します。「ServiceInstall」ノードをコンポーネントの 1 つに追加するために、このファイルに XSL 変換を適用する必要もあります。ノードの追加は、私のような XSL 初心者にとっても非常に簡単です。ただし、結果の XML を適切な形式にするために、Wix ノードと Fragment ノードの両方に WixUtil 拡張機能への参照を追加する必要があります。だから、私のXMLはこれです:

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

ただし、同じメソッドを使用して Fragment ノードに宣言を追加しようとすると、文字化けした xml が返されます。これは、非常に単純で簡単な作業で達成できるように思えます。私は何を間違っていますか?

4

1 に答える 1