XPath в MSBuild (SDC) и WIX

Свежий вопрос этого вопроса->

У меня есть файл WIX, который мне нужно изменить с помощью MSBuild. Это начинается так:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension">

  <?--... Various Removed Params ...-->

  <Product Id='$(var.ProductCode)'
    UpgradeCode='$(var.UpgradeCode)'
    Name='$(var.AppName)' Language="1033" Version='$(var.ProductVersion)'
    Manufacturer='$(var.Manufacturer)'>
    <Package Id='$(var.PackageCode)' InstallerVersion="200" 
    Compressed="yes" />

  <?--... More of the WIX XML file ...-->

  <iis:WebApplication Id='STWebApp' Name='MyWebSite' Isolation='medium' />

  <?--... Rest of the WIX XML file ...-->

Моя проблема заключается в том, что задачи SDC не могут ссылаться ни на один из узлов xml, связанных с WIX. Например:

<XmlFile.SetAttribute Path="$(MSBuildProjectDirectory)\TestProduct.wxs"
         XPath="//iis:WebApplication" Namespaces="@(Namespaces)" 
         Name="Name" Value="$(VersionTag)"/>

работает просто отлично, потому что он не использует никаких узлов Wix (только узел iis), но если я использую полный путь XPath к нему (/Wix/Product/iis:WebApplication), задача возвращает: < strong>Не удалось найти строку ресурса. Не найдено совпадений для выражения XPath

Это не проблема, пока я не захочу сослаться на узел каталога (/Wix/Product/Directory/Directory/Directory/Directory[@Id='STWebSiteDir'])

Я пытался использовать полный XPath и более короткий //Directory[@Id='STWebSiteDir']. Я пробовал одинарные и двойные кавычки, я пытался добавить пространство имен WIX к вызову (без префикса).

<ItemGroup>
  <Namespaces Include="http://schemas.microsoft.com/wix/IIsExtension">
    <Prefix>iis</Prefix>
    <Uri>http://schemas.microsoft.com/wix/IIsExtension</Uri>
  </Namespaces>
  <Namespaces Include="http://schemas.microsoft.com/wix/2006/wi">
    <Prefix></Prefix>
    <Uri>http://schemas.microsoft.com/wix/2006/wi</Uri>
  </Namespaces>
</ItemGroup>

Я даже пытался просто получить ссылку на /Wix/Product, но даже это не удалось:

<XmlFile.SetAttribute Path="$(MSBuildProjectDirectory)\TestProduct.wxs" 
            XPath="/Wix/Product" Namespaces="@(Namespaces)" 
            Name="Name" Value="MODIFIED"/>

Я явно что-то упускаю. Кто-нибудь подскажет, куда обратиться, чтобы заставить это работать?

Ваккано


person Vaccano    schedule 04.05.2009    source источник
comment
Если ваш движок XPath является стандартным, это FAQ: тест QName без префикса выбирает элементы в нулевом (или пустом) URI пространства имен, а не в пространстве имен по умолчанию. Итак, вам нужно зарегистрировать URI пространства имен и привязку префикса и добавить этот префикс к вашему пути, то есть: /wi:Wix/wi:Product   -  person    schedule 25.11.2010


Ответы (4)


Можете ли вы просто определить переменные в командной строке для препроцессора?

candle -dVariableName=ValueForVariable

Это может быть намного проще.

person Rob Mensching    schedule 05.05.2009

Включили ли вы пространство имен Wix по умолчанию в @(пространства имен)?

person David McEwing    schedule 04.05.2009
comment
Я не должен вас понимать, потому что в моем вопросе есть пространство имен WIx !!!!! - person Vaccano; 05.05.2009
comment
Итак, решение, которое у вас есть ниже, - это то, что я пытался сказать. Значение по умолчанию отличается от пустого. - person David McEwing; 05.05.2009
comment
Достаточно верно. Вместо этого проголосовал за тебя. - person Vaccano; 05.05.2009

<ItemGroup>
  <Namespaces Include="http://schemas.microsoft.com/wix/IIsExtension">
    <Prefix>iis</Prefix>
    <Uri>http://schemas.microsoft.com/wix/IIsExtension</Uri>
  </Namespaces>
  <Namespaces Include="http://schemas.microsoft.com/wix/2006/wi">
     <Prefix>wis</Prefix>
    <Uri>http://schemas.microsoft.com/wix/2006/wi</Uri>
  </Namespaces>
</ItemGroup>

вы также должны добавить префикс для пространства имен wi, после этого все будет в порядке, я проверил это.

person sam    schedule 24.11.2010

Итак, вот ответ:

Префикс пространства имен должен отсутствовать для части wix, а не просто оставаться пустым

<ItemGroup>
  <Namespaces Include="http://schemas.microsoft.com/wix/IIsExtension">
    <Prefix>iis</Prefix>
    <Uri>http://schemas.microsoft.com/wix/IIsExtension</Uri>
  </Namespaces>
  <Namespaces Include="http://schemas.microsoft.com/wix/2006/wi">

    <Uri>http://schemas.microsoft.com/wix/2006/wi</Uri>
  </Namespaces>
</ItemGroup>

Затем вам нужно добавить значение префикса в пространство имен wix в файле. Я использовал тст.

Ваккано

person Vaccano    schedule 04.05.2009