2013-06-22 40 views
0

我正在嘗試生成幾個文本文件,具體取決於輸入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); 
     } 
+0

請在此處將相關示例包括在計算器中。 –

+0

嗨,馬丁,我只是想保持這篇文章的簡短... –

回答

0

我與撒克遜9.5 HE的Java運行樣式表(只編輯的文件名分配)

<?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(@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> 

對輸入你在顯示你的帖子和結果是KupacEdit.aspx.cs與內容

protected void SaveButtonEvent(object sender, EventArgs e) 
{ 
MiddletierManager mm = new MiddletierManager(); 
Kupac objectClass = new Kupac(); 

    objectClass.SifraKupca = this.hdnID.Value; 
    objectClass.Ime = this.txtIme.Text; 

    objectClass.Prezime = this.txtPrezime.Text; 

    objectClass.BrojTelefona = this.txtBrojTelefona.Text; 

    objectClass.Adresa = this.txtAdresa.Text; 

mm.Save(objectClass); 
} 

所以我不能重現這個問題。當結果缺少這些值時,確定輸入樣本中是否存在要輸出的屬性?

+0

嗯,是的,屬性確實存在,否則我會在VS調試模式下得到同樣的錯誤,我得到的結果和你一樣。只有我還沒有嘗試過的是安裝新版本的撒克遜 - 我正在使用9.4.4 HE。 –

+0

我從命令行嘗試了.NET版本的Saxon 9.4 HE,並且結果文件也完整,所以我不認爲這是Saxon版本的問題。 –

+0

當你說這不是關於撒克遜版本的時候,你是對的,請告訴我,當你說xml元素缺少屬性時,你是什麼意思?我是否應該改變表達方式以達到它們或什麼?謝謝 –