我有一个我在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中的列表项值?
恐怕我不这么认为。玩弄你的代码时,我收到错误消息,告诉我不支持 List'1 的返回类型(即详细对象的集合)
检查XSLT 扩展对象文档告诉我这一点:
扩展对象返回的数据类型是数字、字符串、布尔和节点集四种基本 XPath 数据类型之一
这很明确地表明,您尝试使用任意 CLR 对象的方式不受支持。
可能值得以稍微不同的方式处理这个问题 - 如果您想要将 CLR 对象与这样的模板合并,那么预编译的 T4 模板可能是更好的选择。我有一篇博客文章在这里描述了这一点:使用 T4 在运行时生成内容