是否可以从DotLiquid模板调用方法?

时间:2015-01-12 14:32:39

标签: dotliquid

显然,您可以调用属性,但调用方法不会做任何事情,即使是从Drop扩展的类。

我试图在我的XmlDocumentDrop类中做这样的事情。

public string XPath
{
  return xmlDoc.DocumentElement.SelectSingleNode(xpath).InnerText;
}

然后在我的DotLiquid模板中。

{{ xmlDoc.XPath("//firstName") }}

这不会返回任何内容。

我试过使用" CatchAll"方法,但我试图通过XPath,它似​​乎剥离所有非单词字符。所以,试着这样做:

{{ xmlDoc.//firstName }}

只需发送" firstName"到BeforeMethod。

我尝试使用XPath模板化XML文档来访问模板中的数据。没有为我可能需要的每个XPath创建属性(不理想,因为想法是让用户模板化XML文档而不必让开发人员参与),我有什么选择?

我可以做一个过滤器,所以像这样:

{{ xmlDoc|xpath:"//firstName" }}

但是过滤器只接受一个字符串,这意味着我将原始XML作为字符串传递,然后在每次调用时重新解析该XML,这并不是很好。

选项?

修改

我也尝试了一个自定义标签,但最后,我仍然将XML作为字符串传递,并且每次都重新解析所有XML。我真正需要的是在我的模板中引用XML文档,以及调用单个方法,传入一串XPath的能力。

1 个答案:

答案 0 :(得分:0)

您可以将XMLDoc作为非字符串传递。只需创建一个接受这样的对象的过滤器:

public static Xpath(object document, string xpath)
{
   var xmlDoc = document as XmlDocumentDrop;
   return xmlDoc.DocumentElement.SelectSingleNode(xpath).InnerText;
}

这样你就不需要重新解析任何东西了。