need help on xml processing

I am trying to divide a xml file(my.xml) like this:

<?xml version="1.0" encoding="UTF-8"?>
<Proto PName="hmmmmmmm">
     <Menu id="A" ver="1">
         <P>
             <P name="AA" Type="X"/>
             <P name="BB" Type="Y"/>
             <P name="CC" Type="Z"/>
         </P>
         <main>
             <K name="DD" type="X"/>
             <K name="EE" type="Y"/>
         </main>
     </Menu>
    <Menu id="B" ver="1">
        <P>
            <P name="XX" Type="X"/>
            <P name="BB" Type="Y"/>
            <P name="CC" Type="Z"/>
        </P>
        <main>
            <K name="DD" type="X"/>
            <K name="EE" type="Y"/>
        </main>
    </Menu>
    <Menu id="C" ver="1">
         <P>
             <P name="ZZ" Type="X"/>
             <P name="BB" Type="Y"/>
             <P name="CC" Type="Z"/>
         </P>
         <main>
             <K name="DD" type="X"/>
             <K name="EE" type="Y"/>
         </main>
     </Menu>
</Proto>

I am trying to get 3 files out of the above. .i.e.

$ cat my.A.xml
<?xml version="1.0" encoding="UTF-8"?>
<Proto PName="hmmmmmmm">
    <Menu id="A" ver="1">
        <P>
            <P name="AA" Type="X"/>
            <P name="BB" Type="Y"/>
            <P name="CC" Type="Z"/>
        </P>
        <main>
            <K name="DD" type="X"/>
            <K name="EE" type="Y"/>
        </main>
    </Menu>
</Proto>


$ cat my.B.xml
<?xml version="1.0" encoding="UTF-8"?>
<Proto PName="hmmmmmmm">
    <Menu id="B" ver="1">
        <P>
            <P name="XX" Type="X"/>
            <P name="BB" Type="Y"/>
            <P name="CC" Type="Z"/>
        </P>
        <main>
            <K name="DD" type="X"/>
            <K name="EE" type="Y"/>
        </main>
    </Menu>
</Proto>

and similarly my.C.xml

I tried this: 

$ awk '/<Menu id=/,/<\/Menu>/' my.xml

is there any way available other than perl for this xml processing.

You can do something like that with awk:

awk -F'"'  '

/<\?xml/ {
   header = $0;
}

/<Proto/ {
   proto = $0;
}

/[[:space:]]*<Menu/ {
   Id = $2;
   OutXml = Out
   gsub(/?/, Id, OutXml);
   print header > OutXml;
   print proto  > OutXml;
}

OutXml {
   print > OutXml
}

/[[:space:]]*<\/Menu/ {
   if (OutXml) {
      print "</Proto>" > OutXml;
      close(OutXml);
   }
   OutXml = "";
}

' Out='my.?.xml' my.xml

The variable Out is the model for output file names, '?' stands for the Menu Id.

Jean-Pierre.

... or XSLT.

using Perl:

#!/usr/bin/perl
use strict;
use warnings;
# separate_xml_protos.pl
my $filename = shift;
open (X_FILE, '<', $filename)  or  die "Failed to read file $filename : $!";
{
    local $/;
    while (<X_FILE>) {
        my $x;
        if (m/(<\?xml (.*?)\?>)/) {
            $x = $1;
        }
        my $proto;
        if (m/(<Proto (.*?)>)/) {
            $proto = $1;
        }
        while (m#(<Menu id="(.*?)"(.*?)</Menu>)#gs) {
            print "\n\n", $2, "\n";
            my $newfile = "my." . $2 . ".xml";
            open (NEW_XML, '>', $newfile)  or  die "Failed to write file";
            print NEW_XML $x, "\n", $proto, "\n", $1, "\n</Proto>\n";
            close NEW_XML;
        }
    }
}
close (X_FILE);

run this script as:

perl separate_xml_protos.pl my.xml

Using XSLT ....

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                extension-element-prefixes="exsl"
                version="1.0">

<xsl:template match="Menu">
   <exsl:document href="{@id}.xml" method="xml">
      <Proto PName="hmmmmmmm">
          <xsl:copy-of select="." />
      </Proto>
   </exsl:document>
</xsl:template>

</xsl:stylesheet>