Generación del xpz
Como dijimos, la generación del xpz se va haciendo desde los dkt.
Los dkts combinan código C# y código GX (KMW), al principio del dkt aparece:
<%@ Template Language="C#" TargetLanguage="GX" Description="Work With Main Template" %>
Lo que se hace con el C# es ir recorriendo y procesando el xml de la instancia y a partir de allí se va escribiendo un nuevo xml de salida (el xpz).
El xpz es también un xml con un cierto formato:
<ExportFile>
<Model> >>> Info sobre las props. del modelo
<Id>1</Id>
<Name>NewKB</Name>
<AttLen>30</AttLen>
<TblLen>30</TblLen>
<ObjLen>30</ObjLen>
</Model>
<KMW> >>> Info sobre la KB
<MajorVersion>2</MajorVersion>
<MinorVersion>2</MinorVersion>
<Path>D:\AJAXSample</Path>
<MaxGxBuildSaved>2601</MaxGxBuildSaved>
</KMW>
<GXObject> >>> Aqui empieza la info de los objetos que están dentro del xpz
<Transaction> (en este caso es solo una TRN)
<Info>
<Name>Client</Name>
<Description>Client</Description>
</Info>
........................
........................
<Structure> >>> Info de la estructura
<Source>
................
</Source>
<LevelInfo> >>> Info de los atributos
<KeyId>1</KeyId>
<Name>Client</Name>
<Description>Client</Description>
</LevelInfo>
<AllowNulls>
<Name>ClientName</Name>
<Value>No</Value>
</AllowNulls>
.......................
</Structure>
<Variable> >>> Info de las variables
<Name>Today</Name>
<Title>Today</Title>
<Type>Date</Type>
<Length>8</Length>
<Decimals>0</Decimals>
<Picture>99/99/99</Picture>
<Property>
<Type>string</Type>
<Name>ATT_PICTURE</Name>
<Value>99/99/99</Value>
</Property>
</Variable>
.....................
<Form>WinForm</FormInfo> >>> Info de los forms
<HTMLForm>WebForm</HTMLForm>
<Events>
...................
</Events> >>> Info de los eventos
..................
</Transaction>
</GXObject>
<GXObject>
<Attributes>
..................
</Attributes>
...............
</GXObject>
</ExportFile>
Entonces lo que se hace es recorrer la instancia con los templates e ir escribiendo el xpz como se describió antes.
Así encontramos en los templates lo siguiente:
<GXObject> >>> Esto se escribe en el xpz
<Transaction> >>> Esto se escribe en el xpz
<%
foreach (XmlNode subNode in trnNode.SelectNodes("*")) >>> Se comienza a recorrer la instancia
{
switch (subNode.Name)
{
case "LastUpdate" :
// Strip LastUpdate info.
break;
case "HTMLForm" :
if (updateWebForm)
{
%>
<%@ CallSubTemplate WWTrnWebForm Transaction='transaction' TransactionNode='TransactionNode' HTMLFormNode='subNode' PgmDescVarId='GetVarId(trnNode, "PgmDesc")' GxRemoveVarId='GetVarId(trnNode, "GxRemove")' Update='Update' %>
<% }
else
{
%>
<%= subNode.OuterXml %> >>> Se escribe toda la info del nodo en el xml
??????????????
case "Events" :
<Events>
??????????????
</Events>
??????????????
</Transaction>
</GXObject>
Algunas clases interesantes para generar el xpz pueden ser:
HTMLToKMW - por ejemplo, para el caso de las celdas se usa TD.
WinToKMW
Ejemplo de uso de estas clases:
Son clases que ayudan a escribir el xml (celdas, controles, etc.)
En este caso los tags HTMLForm y HTMLBlock se escriben directamente en el xpz, y también el resultado de las variables que están entre <% y %>.
Mas info en el Documentation.chm.
Por otro lado se utilizan los métodos InnerXml y OuterXml para escribir subnodos en el xpz.
Estos métodos se utilizan de la siguiente forma, suponiendo que se tiene que generar los siguientes nodos en el xpz: