split2.cd 858 Bytes
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
type Person = FPerson | MPerson
type FPerson = <person gender = "F" >[ Name Children ]
type MPerson = <person gender="M">[ Name Children ]
type Children = <children>[Person*]
type Name = <name>[ PCDATA ]

type Man = <man name=String>[ Sons Daughters ]
type Woman = <woman name=String>[ Sons Daughters ]
type Sons = <sons>[ Man* ]
type Daughters = <daughters>[ Woman* ]

let split (MPerson -> Man ; FPerson -> Woman)
 <_ gender=g>[ <_>n <_>[(mc::<_ gender="M">_ | fc::_)*] ] ->
   let tag = match g with "F" -> `woman | "M" -> `man in
   let s = map mc with x -> split x in
   let d = map fc with x -> split x in       
   <(tag) name=n>[ <sons>s  <daughters>d ] 

match argv with
  | [ f ] -> 
   (match load_xml f with
    |  <doc>(l & [Person*]) -> <doc>(map l with x -> split x)
    | _ -> raise "Invalid document") 
  | _ -> raise "Invalid command line"