Index: genshi/template/tests/markup.py
===================================================================
--- genshi/template/tests/markup.py	(revision 466)
+++ genshi/template/tests/markup.py	(working copy)
@@ -276,6 +276,33 @@
         finally:
             shutil.rmtree(dirname)
 
+    def test_dynamic_match(self):
+        dirname = tempfile.mkdtemp(suffix='genshi_test')
+        try:
+            file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
+            try:
+                file1.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"
+                                     xmlns:py="http://genshi.edgewall.org/">
+                    <span py:match="${xpath}ing">
+                        Hello ${select('@name')}
+                    </span>
+                    <span>Some intervening text.</span>
+                    <greeting name="Dude" />
+                </html>""")
+            finally:
+                file1.close()
+
+            loader = TemplateLoader([dirname])
+            tmpl = loader.load('tmpl1.html')
+            self.assertEqual("""<html>
+                    <span>Some intervening text.</span>
+                    <span>
+                        Hello Dude
+                    </span>
+                </html>""", tmpl.generate(xpath='greet').render())
+        finally:
+            shutil.rmtree(dirname)
+
     def test_fallback_when_include_found(self):
         dirname = tempfile.mkdtemp(suffix='genshi_test')
         try:
Index: genshi/template/directives.py
===================================================================
--- genshi/template/directives.py	(revision 466)
+++ genshi/template/directives.py	(working copy)
@@ -18,7 +18,7 @@
 from genshi.core import Attrs, Stream
 from genshi.path import Path
 from genshi.template.core import TemplateRuntimeError, TemplateSyntaxError, \
-                                 EXPR, _apply_directives
+                                 EXPR, _apply_directives, Template
 from genshi.template.eval import Expression, _parse
 
 __all__ = ['AttrsDirective', 'ChooseDirective', 'ContentDirective',
@@ -393,19 +393,23 @@
       </span>
     </div>
     """
-    __slots__ = ['path', 'namespaces']
+    __slots__ = ['pathlist', 'namespaces', 'filename', 'lineno']
 
     ATTRIBUTE = 'path'
 
     def __init__(self, value, namespaces=None, filename=None, lineno=-1,
                  offset=-1):
         Directive.__init__(self, None, namespaces, filename, lineno, offset)
-        self.path = Path(value, filename, lineno)
+        self.filename = filename
+        self.lineno = lineno
+        self.pathlist = list(Template._interpolate(value, None, filename, lineno, offset))
         self.namespaces = namespaces or {}
 
     def __call__(self, stream, ctxt, directives):
-        ctxt._match_templates.append((self.path.test(ignore_context=True),
-                                      self.path, list(stream), self.namespaces,
+        path_value = "".join([(kind is EXPR) and data.evaluate(ctxt) or data for (kind, data, pos) in self.pathlist])
+        path = Path(path_value, self.filename, self.lineno)
+        ctxt._match_templates.append((path.test(ignore_context=True),
+                                      path, list(stream), self.namespaces,
                                       directives))
         return []
 
