传递XSLT参数列表中的对象列表并在C#中以xsl访问它

rin*_*noy 5 c# xslt

我有一个我在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; }
}
Run Code Online (Sandbox Code Playgroud)

以下是我使用的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>
Run Code Online (Sandbox Code Playgroud)

  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());



    }
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*tly 0

恐怕我不这么认为。玩弄你的代码时,我收到错误消息,告诉我不支持 List'1 的返回类型(即详细对象的集合)

检查XSLT 扩展对象文档告诉我这一点:

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

这很明确地表明,您尝试使用任意 CLR 对象的方式不受支持。

可能值得以稍微不同的方式处理这个问题 - 如果您想要将 CLR 对象与这样的模板合并,那么预编译的 T4 模板可能是更好的选择。我有一篇博客文章在这里描述了这一点:使用 T4 在运行时生成内容