Update XML parser to support revision history check (#30929)

* Update XML parser to support revision history check

* Restyle
diff --git a/scripts/py_matter_idl/matter_idl/data_model_xml/handlers/handlers.py b/scripts/py_matter_idl/matter_idl/data_model_xml/handlers/handlers.py
index ee13991..5fa6f06 100644
--- a/scripts/py_matter_idl/matter_idl/data_model_xml/handlers/handlers.py
+++ b/scripts/py_matter_idl/matter_idl/data_model_xml/handlers/handlers.py
@@ -498,6 +498,39 @@
             return BaseHandler(self.context)
 
 
+class RevisionHistoryHandler(BaseHandler):
+    """
+    Parses elements of revision history that look like:
+
+    '''
+       <revisionHistory>
+         <revision revision="1" summary="Global mandatory ClusterRevision attribute added"/>
+         <revision revision="2" summary="CCB 2808"/>
+         <revision revision="3" summary="All Hubs changes"/>
+         <revision revision="4" summary="New data model format and notation; add IdentifyType"/>
+       </revisionHistory>
+    '''
+    """
+
+    def __init__(self, context: Context, cluster: Cluster):
+        super().__init__(context, handled=HandledDepth.SINGLE_TAG)
+        self._cluster = cluster
+
+    def GetNextProcessor(self, name: str, attrs: AttributesImpl):
+        if name == "revision":
+            if 'revision' not in attrs:
+                LOGGER.error(
+                    f"Could not find a revision for {attrs}: no revision data")
+                return BaseHandler(self.context, handled=HandledDepth.ENTIRE_TREE)
+            else:
+                rev = int(attrs['revision'])
+                if self._cluster.revision < rev:
+                    self._cluster.revision = rev
+            return BaseHandler(self.context, handled=HandledDepth.SINGLE_TAG)
+        else:
+            return BaseHandler(self.context)
+
+
 class DataTypesHandler(BaseHandler):
     def __init__(self, context: Context, cluster: Cluster):
         super().__init__(context, handled=HandledDepth.SINGLE_TAG)
@@ -580,12 +613,7 @@
 
     def GetNextProcessor(self, name: str, attrs: AttributesImpl):
         if name == "revisionHistory":
-            # Revision history COULD be used to find the latest revision of a cluster
-            # however current IDL files do NOT have a revision info field
-            #
-            # NOTE: we COULD set this as a `default` for attribute clusterRevision, however this will likely
-            #       not match with what matter IDL would parse into.
-            return BaseHandler(self.context, handled=HandledDepth.ENTIRE_TREE)
+            return RevisionHistoryHandler(self.context, self._cluster)
         elif name == "section":
             # Documentation data, skipped
             return BaseHandler(self.context, handled=HandledDepth.ENTIRE_TREE)
diff --git a/scripts/py_matter_idl/matter_idl/test_data_model_xml.py b/scripts/py_matter_idl/matter_idl/test_data_model_xml.py
index 06418f8..647a275 100755
--- a/scripts/py_matter_idl/matter_idl/test_data_model_xml.py
+++ b/scripts/py_matter_idl/matter_idl/test_data_model_xml.py
@@ -204,6 +204,8 @@
 
         expected_idl = IdlTextToIdl('''
             client cluster DishwasherMode = 89 {
+               revision 2;
+
                bitmap Feature: bitmap32 {
                    kOnOff = 0x1;
                }