在C#中将对象列表传递给XSLT参数列表并在xsl中访问

5

我有一个类,我在XSL中使用它。

public class PurchaseOrderDTO
{
    public IList<PurchaseOrderDetailsDTO> PurchaseOrderDetailsDTOList { get; set; }
    public String PONo { get; set; }
    public Decimal POValue { get; set; }
    public DateTime? PODate { get; set; }
}

以下是我使用的xsl。
<P>
  Dear,
</P>
Purchase Order No <xsl:value-of select="PurchaseOrderDTO:get_PONo()" /> has
being created <BR />
Purchase Order Value <xsl:value-of select="PurchaseOrderDTO:get_POValue()" /> <BR />
<BR />
Purchase Order Date <xsl:value-of select="PurchaseOrderDTO:get_PODate()" /> <BR />
<BR />

<xsl:for-each select="PurchaseOrderDTO:get_PurchaseOrderDetailsDTOList()">
  <ul>
    <li>
      <p>      
        Item name
      </p>
      <xsl:value-of select="PurchaseOrderDetailsDTO:get_Item()"></xsl:value-of>
    </li>
  </ul>
</xsl:for-each>

  private static PurchaseOrderDTO GetPurchaseOrderDTO()
    {
        PurchaseOrderDTO _PurchaseOrderDTO = new PurchaseOrderDTO();
        Random rand = new Random();

        _PurchaseOrderDTO.PODate = DateTime.Now;
        _PurchaseOrderDTO.PONo = "PO3333";
        _PurchaseOrderDTO.POValue = rand.Next(40200, 960000);

        IList<PurchaseOrderDetailsDTO> _PurchaseOrderDetailsDTOList = new List<PurchaseOrderDetailsDTO>();

        for (int i = 1; i < 3; i++)
        {
            PurchaseOrderDetailsDTO _PurchaseOrderDetailsDTO = new PurchaseOrderDetailsDTO();
            _PurchaseOrderDetailsDTO.ID = (Int16)i;
            _PurchaseOrderDetailsDTO.Item = "Item" + i;
            _PurchaseOrderDetailsDTO.Value = Convert.ToDecimal(rand.Next(100, 500) * i);
            _PurchaseOrderDetailsDTOList.Add(_PurchaseOrderDetailsDTO);
        }

        _PurchaseOrderDTO.PurchaseOrderDetailsDTOList = _PurchaseOrderDetailsDTOList;

        return _PurchaseOrderDTO;


    }

    private static void GetEmailTemplate()
    {
        PurchaseOrderDTO _PurchaseOrderDTO = GetPurchaseOrderDTO();

        XslTransform _XslTransform = new XslTransform();
        _XslTransform.Load("../../Transformer.xslt");

        XmlDocument _XmlDocument = new XmlDocument();
        _XmlDocument.AppendChild(_XmlDocument.CreateElement("Root"));

        XPathNavigator _XPathNavigator = _XmlDocument.CreateNavigator();

        XsltArgumentList _XsltArgumentList = new XsltArgumentList();


        Hashtable _Hashtable = new Hashtable();
        _Hashtable["PurchaseOrderDTO"] = _PurchaseOrderDTO;

        if (_Hashtable != null)
        {
            foreach (DictionaryEntry entry in _Hashtable)
            {
                _XsltArgumentList.AddExtensionObject(entry.Key.ToString(), entry.Value);
            }
        }

        StringBuilder _sb = new StringBuilder();
        XmlTextWriter _XmlTextWriter = new XmlTextWriter(new StringWriter(_sb));

        _XslTransform.Transform(_XPathNavigator, _XsltArgumentList, _XmlTextWriter);

        Console.WriteLine(_sb.ToString());



    }

但是在输出中我没有得到子属性的值。是否可以在XsltArgumentList中访问列表项的值?

1个回答

0

恐怕不是这样的。当我尝试运行您的代码时,出现了错误,告诉我List'1的返回类型不受支持(即详细对象的集合)

查看XSLT扩展对象文档 告诉我:

从扩展对象返回的数据类型是四种基本XPath数据类型之一:数字、字符串、布尔和节点集

这有点明确,说明您正在尝试使用的任意CLR对象不受支持。

如果您想像这样将CLR对象与模板合并,则可能值得稍微改变一下方法 - 预编译的T4模板可能是更好的选择。我在这里写了一篇博客文章描述了这个过程:使用T4在运行时生成内容


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接