入力 XML ドキュメントに存在するオブジェクト要素の数に応じて、いくつかのテキスト ファイルを生成しようとしています。この目的のためにresult-document()
(xslt 2.0) 関数を使用しており、変換は Saxon によって評価されます。
何らかの理由で、Saxon で変換を実行すると、一部のxsl:value-of
関数から値を取得できませんが、VS 2010 Ultimate で標準の XSLT デバッグ (関数をコメントアウトする必要がありますxsl:result-document
) を実行すると、期待どおりの結果が得られます。問題はFillTheObjectFromFormテンプレートxsl:for-each
ループに根ざしています。
誰かが私のテンプレートのどこが間違っているかを指摘できますか?
この投稿を短くするために、XML ファイルと結果ファイルをhttp://hotfile.comにアップロードしました。コード サンプルと入力 XML を次に示します。
XML:
<?xml version="1.0" encoding="utf-8"?>
<dbs:MetaDataRoot FreeForm="true" xmlns:dbs="http://stefan/DbStructure">
<orm:MappingRoot FreeForm="False" MapDataStructure="ASPBaza" TransactionType="ADONET" Namespace="GeneratedCode" xmlns:orm="http://stefan/ORM.xsd">
<orm:Build MapDataStructure="ASPBaza" />
<orm:Assembly Namespace="GeneratedCode" MapDataStructure="ASPBaza" Name="BusinessLayer">
<orm:Objects>
<orm:Object OriginalName="Kupac" Name="Kupac" TableName="Kupac" CollectionName="Kupac" Caption="Kupac" >
<orm:Properties>
<orm:Property Name="SifraKupca" IsPrimaryKey="true" ControlType="System.Windows.Forms.TextBox" ControlPrefix="txt" ControlName="txtSifraKupca" BindProperty="Text" Display="false"></orm:Property>
<orm:Property Name="Ime" IsPrimaryKey="false" ControlPrefix="txt" ControlName="txtIme" BindProperty="Text" Display="true"></orm:Property>
<orm:Property Name="Prezime" IsPrimaryKey="false" ControlPrefix="txt" ControlName="txtPrezime" BindProperty="Text" Display="true"></orm:Property>
<orm:Property Name="BrojTelefona" IsPrimaryKey="false" ControlPrefix="txt" ControlName="txtBrojTelefona" BindProperty="Text" Display="true"></orm:Property>
<orm:Property Name="Adresa" IsPrimaryKey="false" ControlPrefix="txt" ControlName="txtAdresa" BindProperty="Text" Display="true"></orm:Property>
</orm:Properties>
<orm:AllProperties />
</orm:Object>
...
</orm:Objects>
</orm:Assembly>
</orm:MappingRoot>
</dbs:MetaDataRoot>
XSLT:
<?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"
exclude-result-prefixes="msxsl"
xmlns:orm="http://stefan/ORM.xsd"
xmlns:ui="http://stefan/UserInterface">
<xsl:output method="text" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates
select="//orm:Assembly//orm:Objects"
mode="Object"/>
</xsl:copy>
</xsl:template>
<xsl:template match="orm:Objects" mode="Object">
<xsl:for-each select="orm:Object">
<xsl:variable name="dirname"
select ="'..\..\UI\FinalResultWebUIDesignClasses\'"/>
<xsl:variable name="filename"
select="concat($dirname,@Name,'Edit','.aspx.cs')"/>
<xsl:result-document method="text" href="{$filename}">
<xsl:call-template name ="SaveButtonEvent"/>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
<xsl:template name="SaveButtonEvent">
protected void SaveButtonEvent(object sender, EventArgs e)
{
MiddletierManager mm = new MiddletierManager();
<xsl:value-of select="@Name"/> objectClass = new <xsl:value-of select="@Name"/>();
<xsl:call-template name="FillTheObjectFromForm"/>
mm.Save(objectClass);
}
</xsl:template>
<xsl:template name="FillTheObjectFromForm">
<xsl:for-each select="orm:Properties/*">
objectClass.<xsl:value-of select="@Name"/> = this.<xsl:choose>
<xsl:when test ="@ControlPrefix = 'txt' and @IsPrimaryKey='false'">
<xsl:value-of select="@ControlName"/>.<xsl:value-of select="@BindProperty"/>;
</xsl:when>
<xsl:when test ="@ControlPrefix = 'txt' and @IsPrimaryKey='true'">hdnID.Value;</xsl:when>
<xsl:when test="@ControlPrefix ='cbo'">
<xsl:value-of select="@ControlName"/>.<xsl:value-of select="@BindProperty"/>;
</xsl:when>
<xsl:when test="@ControlPrefix ='dtp'">
<xsl:value-of select="@ControlName"/>.Value;
</xsl:when>
<xsl:when test="@ControlPrefix ='chk'">
<xsl:value-of select="@ControlName"/>.Checked;
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
XSLT:コード ファイルの解析に使用される SAXON コード
予想される変換結果と実際の変換結果を表すサンプルを次に示します。
実績:
protected void SaveButtonEvent(object sender, EventArgs e)
{
MiddletierManager mm = new MiddletierManager();
Korpa objectClass = new Korpa();
objectClass.KorpaID = this.
objectClass.SifraKupca = this.
objectClass.Datum = this.
mm.Save(objectClass);
}
予想された結果:
protected void SaveButtonEvent(object sender, EventArgs e)
{
MiddletierManager mm = new MiddletierManager();
Korpa objectClass = new Korpa();
objectClass.KorpaID = this.hdnID.Value;
objectClass.SifraKupca = this.SelectedValue;
objectClass.Datum = this.dtpDatum.Value;
mm.Save(objectClass);
}