Можно ли вызвать метод из шаблона DotLiquid?

Ясно, что вы можете вызывать свойства, но вызов метода ничего не делает, даже для класса, унаследованного от Drop.

Я пытаюсь сделать что-то подобное в своем классе XmlDocumentDrop.

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

Затем в моем шаблоне DotLiquid.

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

Это ничего не возвращает.

Я пытался использовать метод "CatchAll", но я пытаюсь передать XPath, и он, похоже, удаляет все несловные символы. Итак, пытаясь сделать это:

{{ xmlDoc.//firstName }}

Просто отправляет "firstName" в BeforeMethod.

Я пытаюсь создать шаблон XML-документа, используя XPath для доступа к данным из шаблона. За исключением создания свойств для каждого XPath, который мне может понадобиться (не идеально, так как идея состоит в том, чтобы позволить пользователям создавать шаблоны XML-документа без необходимости привлечения разработчика), какие у меня есть варианты?

Я мог бы сделать фильтр, так что-то вроде этого:

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

Но фильтр принимает только строку, что означает, что я передаю необработанный XML как строку, а затем повторно анализирую этот XML каждый раз, когда он вызывается, что не очень хорошо.

Опции?

Изменить:

Я тоже попробовал пользовательский тег, но, в конце концов, я все еще передаю XML в виде строки и каждый раз повторно анализирую весь XML. Что мне действительно нужно, так это ссылка на XML-документ в моем шаблоне и возможность вызывать единственный метод, передавая строку XPath.


person Deane    schedule 12.01.2015    source источник
comment
Хм, это сложно. Обычный ответ в такой ситуации — BeforeMethod, но, как вы указали, это не будет работать для запросов XPath, которые не являются допустимыми идентификаторами. Фильтр может быть единственным решением, хотя это и не очень хорошо.   -  person Tim Jones    schedule 13.01.2015
comment
У вас есть внутреннее ощущение, насколько большими могут быть изменения? Я был бы готов поддерживать вилку для этого.   -  person Deane    schedule 13.01.2015
comment
Я полностью погрузился в Liquid.VariableParser. Регулярное выражение будет анализировать xmlDoc.XPath(//firstName) в (1) xmlDoc, (2) XPath и (3) firstName. Любое изменение должно было бы испортить основной метод разбора переменных, что я не могу не считать болезненным изменением.   -  person Deane    schedule 15.01.2015
comment
Я переместил это в группу Google, так как это запрос функции.   -  person Deane    schedule 15.01.2015


Ответы (1)


Вы можете передать XMLDoc не как строку. Просто создайте фильтр, который принимает такой объект:

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

Таким образом, вам не нужно ничего повторно анализировать.

person Woland    schedule 23.01.2015