Skip to content

Commit 4e4913f

Browse files
committed
Add xpath filter to python liquid
1 parent dc18556 commit 4e4913f

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

llmstack/common/utils/liquid.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import ast
22
import json
3+
import logging
34
from urllib.parse import quote_plus
45

6+
import lxml.etree as ET
57
from liquid import Environment
68

79
# Add custom filters
810
env = Environment()
11+
logger = logging.getLogger(__name__)
912

1013

1114
def todict(value):
@@ -31,6 +34,29 @@ def escape_unicode(value):
3134
return value
3235

3336

37+
def xpath_filter(xml_string, xpath_expr):
38+
# Parse the XML string
39+
try:
40+
root = ET.fromstring(xml_string)
41+
except ET.XMLSyntaxError as e:
42+
logger.exception(e)
43+
44+
return xml_string
45+
46+
# Apply the XPath expression
47+
try:
48+
filtered_elements = root.xpath(xpath_expr)
49+
except ET.XPathEvalError as e:
50+
logger.exception(e)
51+
return xml_string
52+
53+
# Serialize the filtered elements to a string
54+
result = ""
55+
for element in filtered_elements:
56+
result += ET.tostring(element)
57+
return result
58+
59+
3460
env.add_filter("urlencode", quote_plus)
3561
env.add_filter("tojson", json.dumps)
3662
env.add_filter("to_json", json.dumps)
@@ -39,6 +65,7 @@ def escape_unicode(value):
3965
env.add_filter("escape_unicode", escape_unicode)
4066
env.add_filter("tostring", to_string)
4167
env.add_filter("to_string", to_string)
68+
env.add_filter("xpath", xpath_filter)
4269

4370

4471
def render_template(template, data):

0 commit comments

Comments
 (0)