MSBuild elemek

Az MSBuild elemek bemenetek a buildelési rendszerbe, és általában fájlokat jelölnek (a fájlokat az Include attribútum adja meg). Az elemek elemtípusokba vannak csoportosítva az elemnevek alapján. Az elemtípusok olyan elemek nevesített listájai, amelyek a tevékenységek paramétereiként használhatók. A feladatok az elemértékekkel hajtják végre a buildelési folyamat lépéseit.

Mivel az elemek neve az az elemtípus, amelyhez tartoznak, az "elem" és az "elemérték" kifejezés felcserélhető.

Elemek létrehozása projektfájlban

A projektfájl elemeit elemcsoportelem gyermekelemeként deklarálhatja. Az érvényes elemnevek nagybetűvel vagy kisbetűvel vagy aláhúzásjellel kezdődnek(_); az érvényes további karakterek közé tartoznak az alfanumerikus karakterek (betűk vagy számjegyek), az aláhúzás és a kötőjel (-). A gyermekelem neve az elem típusa. Az Include elem attribútuma határozza meg az adott elemtípushoz hozzáadni kívánt elemeket (fájlokat). A következő XML például létrehoz egy elnevezett Compileelemtípust, amely két fájlt tartalmaz.

<ItemGroup>
    <Compile Include = "file1.cs"/>
    <Compile Include = "file2.cs"/>
</ItemGroup>

A file2.cs elem nem helyettesíti az elemet file1.cs; ehelyett a fájlnév hozzá lesz fűzve az elemtípus értékeinek listájához Compile .

Az alábbi XML ugyanazt az elemtípust hozza létre úgy, hogy mindkét fájlt egy Include attribútumban deklarálja. Figyelje meg, hogy a fájlneveket pontosvessző választja el egymástól.

<ItemGroup>
    <Compile Include = "file1.cs;file2.cs"/>
</ItemGroup>

Az Include attribútum egy olyan elérési út, amely a projektfájl mappája alapján van értelmezve, még akkor is, $(MSBuildProjectPath)ha az elem egy importált fájlban, például egy .targets fájlban található.

Elemek létrehozása a végrehajtás során

A Célelemeken kívül eső elemek a build kiértékelési fázisában vannak hozzárendelve értékekhez. A következő végrehajtási fázisban az elemek a következő módokon hozhatók létre vagy módosíthatók:

Projektfájl hivatkozási elemei

Ha a projektfájlban az elemtípusokra szeretne hivatkozni, használja a szintaxist @(ItemType). Például az előző példában szereplő elemtípusra hivatkozhat a használatával @(Compile). Ezzel a szintaxissal elemeket adhat át a tevékenységeknek úgy, hogy megadja az elemtípust a tevékenység paramétereként. További információ : Útmutató: Válassza ki a létrehozandó fájlokat.

Az elemtípus elemei alapértelmezés szerint pontosvesszővel vannak elválasztva (;) kibontásakor. A szintaxissal @(ItemType, 'separator') megadhat egy elválasztót, amely nem az alapértelmezett. További információ : Útmutató: Elemlista megjelenítése vesszővel elválasztva.

Elemek megadása helyettesítő karakterek használatával

A **, *, és ? helyettesítő karakterek használatával megadhat egy fájlcsoportot bemenetként egy buildhez, ahelyett, hogy külön listázni szeretné az egyes fájlokat.

  • A ? helyettesítő karakter egyetlen karakterrel egyezik.
  • A * helyettesítő karakter nulla vagy több karakternek felel meg.
  • A ** helyettesítő karaktersorozat egy részleges elérési útnak felel meg.

Megadhatja például a .cs projektfájlt tartalmazó könyvtár összes fájlját a projektfájl alábbi elemével.

<CSFile Include="*.cs"/>

A következő elem az összes .vb fájlt kijelöli a D: meghajtón:

<VBFile Include="D:/**/*.vb"/>

Ha a helyettesítő karakterek kiterjesztése nélkül szeretne literális * vagy ? karaktereket belefoglalni egy elembe, akkor el kell menekülnie a helyettesítő karakterek elől.

További információ a helyettesítő karakterekről : Útmutató: Válassza ki a létrehozandó fájlokat.

A Kizárás attribútum használata

Az elemelemek tartalmazhatják az Exclude attribútumot, amely kizár bizonyos elemeket (fájlokat) az elemtípusból. Az Exclude attribútumot általában helyettesítő karakterekkel együtt használják. Az alábbi XML például hozzáadja a könyvtár minden .cs fájlját az CSFile elemtípushoz, kivéve a DoNotBuild.cs fájlt.

<ItemGroup>
    <CSFile  Include="*.cs"  Exclude="DoNotBuild.cs"/>
</ItemGroup>

Az Exclude attribútum csak azokat az elemeket érinti, amelyeket az Include attribútum hozzáad a mindkettőt tartalmazó elemelemhez. Az alábbi példa nem zárja ki a fájl Form1.cs, amely az előző elemelemben lett hozzáadva.

<Compile Include="*.cs" />
<Compile Include="*.res" Exclude="Form1.cs">

További információ : How to: Exclude files from the build.

Elem metaadatai

Az elemek metaadatokat is tartalmazhatnak a benne és Include az Exclude attribútumokban található információk mellett. Ezeket a metaadatokat olyan tevékenységek használhatják, amelyek további információkat igényelnek az elemekről, vagy kötegelhetik a tevékenységeket és célokat. További információ: Batching.

A metaadatok kulcs-érték párok gyűjteménye, amelyeket a projektfájl egy elemelem gyermekelemeként deklarál. A gyermekelem neve a metaadatok neve, a gyermekelem értéke pedig a metaadatok értéke.

A metaadatok az azt tartalmazó elemelemhez lesznek társítva. Az alábbi XML például olyan metaadatokat ad Culture hozzá, amelyek az Fr és two.cs elemeire egyaránt érvényesekCSFile.

<ItemGroup>
    <CSFile Include="one.cs;two.cs">
        <Culture>Fr</Culture>
    </CSFile>
</ItemGroup>

Egy elemnek nulla vagy több metaadatértéke lehet. A metaadat-értékeket bármikor módosíthatja. Ha üres értékre állítja a metaadatokat, gyakorlatilag eltávolítja azt a buildből.

Referenciaelem metaadatai egy projektfájlban

Az elem metaadataira a projektfájlban a szintaxis %(ItemMetadataName)használatával hivatkozhat. Ha kétértelműség áll fenn, a hivatkozás az elemtípus nevével minősíthető. Például megadhatja %(ItemType.ItemMetaDataName). Az alábbi példa a Display metaadatok használatával kötegeli a Message feladatot. További információ az elem metaadatainak kötegeltítéshez való használatáról: Item metadata in task batching.

<Project>
    <ItemGroup>
        <Stuff Include="One.cs" >
            <Display>false</Display>
        </Stuff>
        <Stuff Include="Two.cs">
            <Display>true</Display>
        </Stuff>
    </ItemGroup>
    <Target Name="Batching">
        <Message Text="@(Stuff)" Condition=" '%(Display)' == 'true' "/>
    </Target>
</Project>

Jól ismert elem metaadatai

Amikor egy elemet hozzáad egy elemtípushoz, az elemhez hozzá lesz rendelve néhány jól ismert metaadat. Például minden elem rendelkezik a jól ismert metaadatokkal %(Filename), amelyek értéke az elem fájlneve (a bővítmény nélkül). További információkért lásd a jól ismert elem metaadatait.

Elemtípusok átalakítása metaadatok használatával

Metaadatok használatával új elemlistákká alakíthatja az elemlistákat. A kifejezés CppFileshasználatával például átalakíthat egy olyan elemtípust.cpp, amely fájlokat ábrázoló .obj elemeket tartalmaz.@(CppFiles -> '%(Filename).obj')

Az alábbi kód létrehoz egy elemtípust CultureResource , amely az összes EmbeddedResource metaadatot tartalmazó elem másolatát Culture tartalmazza. A Culture metaadat-érték lesz az új metaadatok CultureResource.TargetDirectoryértéke.

<Target Name="ProcessCultureResources">
    <ItemGroup>
        <CultureResource Include="@(EmbeddedResource)"
            Condition="'%(EmbeddedResource.Culture)' != ''">
            <TargetDirectory>%(EmbeddedResource.Culture) </TargetDirectory>
        </CultureResource>
    </ItemGroup>
</Target>

További műveletek az elemeken: MSBuild elemfüggvények és átalakítások.

Elemdefiníciók

Az ItemDefinitionGroup elem használatával bármilyen elemtípushoz hozzáadhat alapértelmezett metaadatokat. A jól ismert metaadatokhoz hasonlóan az alapértelmezett metaadatok is a megadott elemtípus összes eleméhez társítva lesznek. Az elemdefiníciókban explicit módon felülbírálhatja az alapértelmezett metaadatokat. Az alábbi XML például a Compile "Hétfő" értékkel one.cs és three.cs a metaadatokat BuildDay . A kód megadja az elemet , two.cs a metaadatokat BuildDay a "Kedd" értékkel.

<ItemDefinitionGroup>
    <Compile>
        <BuildDay>Monday</BuildDay>
    </Compile>
</ItemDefinitionGroup>
<ItemGroup>
    <Compile Include="one.cs;three.cs" />
    <Compile Include="two.cs">
        <BuildDay>Tuesday</BuildDay>
    </Compile>
</ItemGroup>

További információ: Elemdefiníciók.

Attribútumok egy cél elemcsoportjában lévő elemekhez

Target elemek tartalmazhatnak elemelemeket tartalmazó ItemGroup-elemeket . Az ebben a szakaszban szereplő attribútumok akkor érvényesek, ha egy adott elemhez ItemGroup vannak megadva.Target

Attribútum eltávolítása

Az Remove attribútum eltávolít bizonyos elemeket (fájlokat) az elemtípusból. Ez az attribútum a .NET Framework 3.5-ben lett bevezetve (csak a célokon belül). Az MSBuild 15.0-tól kezdve a belső és a külső célok is támogatottak.

Az alábbi példa minden .config fájlt eltávolít az Compile elemtípusból.

<Target>
    <ItemGroup>
        <Compile Remove="*.config"/>
    </ItemGroup>
</Target>

MatchOnMetadata attribútum

Az MatchOnMetadata attribútum csak Remove olyan attribútumokra alkalmazható, amelyek más elemekre hivatkoznak (például ), és utasítja a Remove="@(Compile);@(Content)" műveletet, Removehogy az elemeket a megadott metaadatnevek értékei alapján egyezzen meg az elemértékek helyett.

A következőhöz B Remove="@(A)" MatchOnMetadata="M"tartozó egyező szabály: Távolítsa el az összes olyan elemetB, amelynek metaadatai MV megegyeznek MA az érték Mmetaadataival V .

<Project>
  <ItemGroup>
    <A Include='a1' M1='1' M2='a' M3="e"/>
    <A Include='b1' M1='2' M2='x' M3="f"/>
    <A Include='c1' M1='3' M2='y' M3="g"/>
    <A Include='d1' M1='4' M2='b' M3="h"/>

    <B Include='a2' M1='x' m2='c' M3="m"/>
    <B Include='b2' M1='2' m2='x' M3="n"/>
    <B Include='c2' M1='2' m2='x' M3="o"/>
    <B Include='d2' M1='3' m2='y' M3="p"/>
    <B Include='e2' M1='3' m2='Y' M3="p"/>
    <B Include='f2' M1='4'        M3="r"/>
    <B Include='g2'               M3="s"/>

    <B Remove='@(A)' MatchOnMetadata='M1;M2'/>
  </ItemGroup>

  <Target Name="PrintEvaluation">
    <Message Text="%(B.Identity) M1='%(B.M1)' M2='%(B.M2)' M3='%(B.M3)'" />
  </Target>
</Project>

A példában az elemértékek b2, c2és d2 az elemből B el lesznek távolítva, mert:

  • b2és c2 a B mérkőzés ellen b1 a AM1=2M2=x
  • d2a mérkőzések B között c1 a AM1=3M2=y

A Message feladat a következőket adja ki:

  a2 M1='x' M2='c' M3='m'
  e2 M1='3' M2='Y' M3='p'
  f2 M1='4' M2='' M3='r'
  g2 M1='' M2='' M3='s'

Az MatchOnMetadata példahasználata:

      <_TransitiveItemsToCopyToOutputDirectory Remove="@(_ThisProjectItemsToCopyToOutputDirectory)" MatchOnMetadata="TargetPath" MatchOnMetadataOptions="PathLike" />

Ez a sor eltávolítja azokat az elemeket _TransitiveItemsToCopyToOutputDirectory , amelyekben ugyanazok TargetPath a metaadatértékek szerepelnek a következő elemekben: _ThisProjectItemsToCopyToOutputDirectory

MatchOnMetadataOptions attribútum

Megadja a metaadatok értékeinek elemek közötti egyeztetéséhez használt MatchOnMetadata sztringegyeztetési stratégiát (a metaadatnevek mindig érzéketlenek). A lehetséges értékek a következők CaseSensitive: , CaseInsensitivevagy PathLike. Az alapértelmezett érték a CaseSensitive.

PathLike útvonalérzékeny normalizálást alkalmaz az olyan értékekre, mint a perjelek tájolásának normalizálása, a záró perjelek figyelmen kívül hagyása, a kizárás . és ..az összes relatív elérési út abszolútvá tétele az aktuális könyvtárhoz képest.

KeepMetadata attribútum

Ha egy elem egy célon belül jön létre, az elemelem tartalmazhatja az KeepMetadata attribútumot. Ha ez az attribútum meg van adva, csak a pontosvesszővel tagolt nevek listájában megadott metaadatok kerülnek át a forráselemből a célelembe. Az attribútum üres értéke egyenértékű azzal, hogy nem adja meg. Az KeepMetadata attribútum a .NET-keretrendszer 4.5-ös kiadásában lett bevezetve.

Az alábbi példa az attribútum használatát KeepMetadata mutatja be.

<Project>
    <ItemGroup>
        <FirstItem Include="rhinoceros">
            <Class>mammal</Class>
            <Size>large</Size>
        </FirstItem>

    </ItemGroup>
    <Target Name="MyTarget">
        <ItemGroup>
            <SecondItem Include="@(FirstItem)" KeepMetadata="Class" />
        </ItemGroup>

        <Message Text="FirstItem: %(FirstItem.Identity)" />
        <Message Text="  Class: %(FirstItem.Class)" />
        <Message Text="  Size:  %(FirstItem.Size)"  />

        <Message Text="SecondItem: %(SecondItem.Identity)" />
        <Message Text="  Class: %(SecondItem.Class)" />
        <Message Text="  Size:  %(SecondItem.Size)"  />
    </Target>
</Project>

<!--
Output:
  FirstItem: rhinoceros
    Class: mammal
    Size:  large
  SecondItem: rhinoceros
    Class: mammal
    Size:
-->

RemoveMetadata attribútum

Ha egy elem egy célon belül jön létre, az elemelem tartalmazhatja az RemoveMetadata attribútumot. Ha ez az attribútum meg van adva, az összes metaadat át lesz adva a forráselemből a célelembe, kivéve azokat a metaadatokat, amelyek neve szerepel a pontosvesszővel tagolt nevek listájában. Az attribútum üres értéke egyenértékű azzal, hogy nem adja meg. Az RemoveMetadata attribútum a .NET-keretrendszer 4.5-ös kiadásában lett bevezetve.

Az alábbi példa az attribútum használatát RemoveMetadata mutatja be.

<Project>

    <PropertyGroup>
        <MetadataToRemove>Size;Material</MetadataToRemove>
    </PropertyGroup>

    <ItemGroup>
        <Item1 Include="stapler">
            <Size>medium</Size>
            <Color>black</Color>
            <Material>plastic</Material>
        </Item1>
    </ItemGroup>

    <Target Name="MyTarget">
        <ItemGroup>
            <Item2 Include="@(Item1)" RemoveMetadata="$(MetadataToRemove)" />
        </ItemGroup>

        <Message Text="Item1: %(Item1.Identity)" />
        <Message Text="  Size:     %(Item1.Size)" />
        <Message Text="  Color:    %(Item1.Color)" />
        <Message Text="  Material: %(Item1.Material)" />
        <Message Text="Item2: %(Item2.Identity)" />
        <Message Text="  Size:     %(Item2.Size)" />
        <Message Text="  Color:    %(Item2.Color)" />
        <Message Text="  Material: %(Item2.Material)" />
    </Target>
</Project>

<!--
Output:
  Item1: stapler
    Size:     medium
    Color:    black
    Material: plastic
  Item2: stapler
    Size:
    Color:    black
    Material:
-->

Az elemekkel kapcsolatos további műveletekért tekintse meg az MSBuild elemfüggvényeket.

KeepDuplicates attribútum

Ha egy elem egy célon belül jön létre, az elemelem tartalmazhatja az KeepDuplicates attribútumot. KeepDuplicates egy Boolean attribútum, amely meghatározza, hogy hozzá kell-e adni egy elemet a célcsoporthoz, ha az elem egy meglévő elem pontos másolata.

Ha a forrás- és célelem ugyanazzal Include az értékkel rendelkezik, de más metaadatokkal rendelkezik, akkor is hozzáadja az elemet, ha KeepDuplicates a beállítás értéke false. Az attribútum üres értéke egyenértékű azzal, hogy nem adja meg. Az KeepDuplicates attribútum a .NET-keretrendszer 4.5-ös kiadásában lett bevezetve.

Az alábbi példa az attribútum használatát KeepDuplicates mutatja be.

<Project>

    <ItemGroup>
        <Item1 Include="hourglass;boomerang" />
        <Item2 Include="hourglass;boomerang" />
    </ItemGroup>

    <Target Name="MyTarget">
        <ItemGroup>
            <Item1 Include="hourglass" KeepDuplicates="false" />
            <Item2 Include="hourglass" />
        </ItemGroup>

        <Message Text="Item1: @(Item1)" />
        <Message Text="  %(Item1.Identity)  Count: @(Item1->Count())" />
        <Message Text="Item2: @(Item2)" />
        <Message Text="  %(Item2.Identity)  Count: @(Item2->Count())" />
    </Target>
</Project>

<!--
Output:
  Item1: hourglass;boomerang
    hourglass  Count: 1
    boomerang  Count: 1
  Item2: hourglass;boomerang;hourglass
    hourglass  Count: 2
    boomerang  Count: 1
-->

Mivel az attribútum az KeepDuplicates elemértékek mellett az elemek metaadatait is figyelembe veszi, fontos tudni, hogy mi történik a metaadatokkal. Lásd például az Ismétlődések észlelése a Metaadatok elemfüggvény használatakor című témakört.

Metaadatok frissítése célon kívüli ItemGroup-elemeken

A célokon kívüli elemek az attribútumon keresztül frissíthetik meglévő Update metaadataikat. Ez az attribútum nem érhető el a célok alatt lévő elemekhez.

<Project>
    <PropertyGroup>
        <MetadataToUpdate>pencil</MetadataToUpdate>
    </PropertyGroup>

    <ItemGroup>
        <Item1 Include="stapler">
            <Size>medium</Size>
            <Color>black</Color>
            <Material>plastic</Material>
        </Item1>
        <Item1 Include="pencil">
            <Size>small</Size>
            <Color>yellow</Color>
            <Material>wood</Material>
        </Item1>
        <Item1 Include="eraser">
            <Color>red</Color>
        </Item1>
        <Item1 Include="notebook">
            <Size>large</Size>
            <Color>white</Color>
            <Material>paper</Material>
        </Item1>

        <Item2 Include="notebook">
            <Size>SMALL</Size>
            <Color>YELLOW</Color>
        </Item2>

        <!-- Metadata can be expressed either as attributes or as elements -->
        <Item1 Update="$(MetadataToUpdate);stapler;er*r;@(Item2)" Price="10" Material="">
            <Color>RED</Color>
        </Item1>
    </ItemGroup>

    <Target Name="MyTarget">
        <Message Text="Item1: %(Item1.Identity)
    Size: %(Item1.Size)
    Color: %(Item1.Color)
    Material: %(Item1.Material)
    Price: %(Item1.Price)" />
    </Target>
</Project>

<!--  
Item1: stapler
    Size: medium
    Color: RED
    Material:
    Price: 10
Item1: pencil
    Size: small
    Color: RED
    Material:
    Price: 10
Item1: eraser
    Size:
    Color: RED
    Material:
    Price: 10
Item1: notebook
    Size: large
    Color: RED
    Material:
    Price: 10
-->

Az MSBuild 16.6-os és újabb verzióiban az attribútum támogatja a Update minősített metaadat-hivatkozásokat, hogy megkönnyítse a metaadatok importálását két vagy több elemből.

<Project>
    <ItemGroup>
        <Item1 Include="stapler">
            <Size>medium</Size>
            <Color>black</Color>
            <Material>plastic</Material>
        </Item1>
        <Item1 Include="pencil">
            <Size>small</Size>
            <Color>yellow</Color>
            <Material>wood</Material>
        </Item1>
        <Item1 Include="eraser">
            <Size>small</Size>
            <Color>red</Color>
            <Material>gum</Material>
        </Item1>
        <Item1 Include="notebook">
            <Size>large</Size>
            <Color>white</Color>
            <Material>paper</Material>
        </Item1>

        <Item2 Include="pencil">
            <Size>MEDIUM</Size>
            <Color>RED</Color>
            <Material>PLASTIC</Material>
            <Price>10</Price>
        </Item2>

        <Item3 Include="notebook">
            <Size>SMALL</Size>
            <Color>BLUE</Color>
            <Price>20</Price>
        </Item3>

        <!-- Metadata can be expressed either as attributes or as elements -->
        <Item1 Update="@(Item2);er*r;@(Item3)" Size="%(Size)" Color="%(Item2.Color)" Price="%(Item3.Price)" Model="2020">
            <Material Condition="'%(Item2.Material)' != ''">Premium %(Item2.Material)</Material>
        </Item1>
    </ItemGroup>

    <Target Name="MyTarget">
        <Message Text="Item1: %(Item1.Identity)
    Size: %(Item1.Size)
    Color: %(Item1.Color)
    Material: %(Item1.Material)
    Price: %(Item1.Price)
    Model: %(Item1.Model)" />
    </Target>
</Project>

<!--  
Item1: stapler
    Size: medium
    Color: black
    Material: plastic
    Price:
    Model:
Item1: pencil
    Size: small
    Color: RED
    Material: Premium PLASTIC
    Price:
    Model: 2020
Item1: eraser
    Size: small
    Color:
    Material: gum
    Price:
    Model: 2020
Item1: notebook
    Size: large
    Color:
    Material: paper
    Price: 20
    Model: 2020
-->

Megjegyzések:

  • A nem minősített metaadatok (%(MetadataName)) a frissítendő elemtípushoz kötődnek (Item1 a fenti példában). A minősített metaadatok (%(Item2.Color)) az Update kifejezés rögzített egyező elemtípusainak készletén belül kötnek.
  • Ha egy elem többszörösen egyezik több hivatkozott elemen belül és között:
    • Az egyes hivatkozott elemtípusok utolsó előfordulása rögzítve lesz (tehát elemtípusonként egy rögzített elem).
    • Ez megegyezik a tevékenységelem-kötegelés viselkedésével a célok alatt.
  • Ahol %() hivatkozásokat helyezhet el:
    • Metadaták
    • Metaadat-feltételek
  • A metaadatok nevének egyeztetése kis- és nagybetűket nem érzékelyítő.

Metaadatok frissítése egy cél elemcsoportjában lévő elemeken

A metaadatok a célokon belül is módosíthatók kevésbé kifejező szintaxissal, mint Update:

<Project>
    <ItemGroup>
        <Item1 Include="stapler">
            <Size>medium</Size>
            <Color>black</Color>
            <Material>plastic</Material>
        </Item1>
        <Item1 Include="pencil">
            <Size>small</Size>
            <Color>yellow</Color>
            <Material>wood</Material>
        </Item1>
        <Item1 Include="eraser">
            <Size>small</Size>
            <Color>red</Color>
            <Material>gum</Material>
        </Item1>
        <Item1 Include="notebook">
            <Size>large</Size>
            <Color>white</Color>
            <Material>paper</Material>
        </Item1>

        <Item2 Include="pencil">
            <Size>MEDIUM</Size>
            <Color>RED</Color>
            <Material>PLASTIC</Material>
            <Price>10</Price>
        </Item2>

        <Item2 Include="ruler">
            <Color>GREEN</Color>
        </Item2>

    </ItemGroup>

    <Target Name="MyTarget">
        <ItemGroup>
            <!-- Metadata can be expressed either as attributes or as elements -->
            <Item1 Size="GIGANTIC" Color="%(Item2.Color)">
                <Material Condition="'%(Item2.Material)' != ''">Premium %(Item2.Material)</Material>
            </Item1>
        </ItemGroup>

        <Message Text="Item1: %(Item1.Identity)
    Size: %(Item1.Size)
    Color: %(Item1.Color)
    Material: %(Item1.Material)
    Price: %(Item1.Price)
    Model: %(Item1.Model)" />
    </Target>
</Project>

<!--  
Item1: stapler
    Size: GIGANTIC
    Color: GREEN
    Material: Premium PLASTIC
    Price:
    Model:
Item1: pencil
    Size: GIGANTIC
    Color: GREEN
    Material: Premium PLASTIC
    Price:
    Model:
Item1: eraser
    Size: GIGANTIC
    Color: GREEN
    Material: Premium PLASTIC
    Price:
    Model:
Item1: notebook
    Size: GIGANTIC
    Color: GREEN
    Material: Premium PLASTIC
    Price:
    Model:
-->