我正在嘗試生成幾個文本文件,具體取決於輸入XML文檔中存在的對象元素的數量。爲此,我使用result-document()
(xslt 2.0)函數,並且轉換由Saxon進行評估。xslt未解析的值
由於某些原因,在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:用於解析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>
SAXON代碼:code file
這裏是表示預期的樣品和實際轉換結果:
實際結果:
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);
}
請在此處將相關示例包括在計算器中。 –
嗨,馬丁,我只是想保持這篇文章的簡短... –