11import ast
22import json
3+ import logging
34from urllib .parse import quote_plus
45
6+ import lxml .etree as ET
57from liquid import Environment
68
79# Add custom filters
810env = Environment ()
11+ logger = logging .getLogger (__name__ )
912
1013
1114def 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+
3460env .add_filter ("urlencode" , quote_plus )
3561env .add_filter ("tojson" , json .dumps )
3662env .add_filter ("to_json" , json .dumps )
@@ -39,6 +65,7 @@ def escape_unicode(value):
3965env .add_filter ("escape_unicode" , escape_unicode )
4066env .add_filter ("tostring" , to_string )
4167env .add_filter ("to_string" , to_string )
68+ env .add_filter ("xpath" , xpath_filter )
4269
4370
4471def render_template (template , data ):
0 commit comments