2013-06-22 37 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元素缺少属性时,你是什么意思?我是否应该改变表达方式以达到它们或什么?谢谢 –