{"id":21326360,"url":"https://github.com/katydid/validator-go-relaxng","last_synced_at":"2026-02-25T01:36:03.796Z","repository":{"id":57552058,"uuid":"44009116","full_name":"katydid/validator-go-relaxng","owner":"katydid","description":"Translates RelaxNG to Relapse","archived":false,"fork":false,"pushed_at":"2025-04-21T18:47:59.000Z","size":3857,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-21T19:45:40.014Z","etag":null,"topics":["relaxng","relaxng-grammar","translates-relaxng","validation","xml"],"latest_commit_sha":null,"homepage":"http://katydid.github.io/relaxng/play/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/katydid.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2015-10-10T12:06:49.000Z","updated_at":"2025-04-21T18:48:02.000Z","dependencies_parsed_at":"2025-04-22T04:02:49.205Z","dependency_job_id":null,"html_url":"https://github.com/katydid/validator-go-relaxng","commit_stats":null,"previous_names":["katydid/validator-go-relaxng","katydid/relaxng"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/katydid/validator-go-relaxng","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/katydid%2Fvalidator-go-relaxng","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/katydid%2Fvalidator-go-relaxng/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/katydid%2Fvalidator-go-relaxng/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/katydid%2Fvalidator-go-relaxng/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/katydid","download_url":"https://codeload.github.com/katydid/validator-go-relaxng/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/katydid%2Fvalidator-go-relaxng/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29807996,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T22:43:48.403Z","status":"ssl_error","status_checked_at":"2026-02-24T22:43:18.536Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["relaxng","relaxng-grammar","translates-relaxng","validation","xml"],"created_at":"2024-11-21T21:09:28.173Z","updated_at":"2026-02-25T01:36:03.781Z","avatar_url":"https://github.com/katydid.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"#Translates RelaxNG to Katydid\n\nTranslates Simplified [RelaxNG](http://relaxng.org/) Grammars to the [Katydid](https://github.com/katydid/katydid) Relapse Grammar.\n\nThere is a playground available here http://katydid.github.io/relaxng/play/\n\nSimplification is defined at these two resources:\n  - http://debeissat.nicolas.free.fr/relaxng_simplification.php\n  - http://books.xmlschemata.org/relaxng/relax-CHP-15-SECT-1.html\n\n## Usage\n\n```\nsimplifiedRelaxNG := `\n\u003cgrammar\u003e\n    \u003cstart\u003e\n        \u003cref name=\"element1\"\u003e\u003c/ref\u003e\n    \u003c/start\u003e\n    \u003cdefine name=\"element1\"\u003e\n        \u003celement\u003e\n            \u003cname\u003efoo\u003c/name\u003e\n            \u003cempty\u003e\u003c/empty\u003e\n        \u003c/element\u003e\n    \u003c/define\u003e\n\u003c/grammar\u003e`\nrelaxing, _ := ParseGrammar([]byte(simplifiedRelaxNG))\nrelapse, _ := Translate(relaxing)\ninput := \"\u003cfoo/\u003e\"\nif err := Validate(relapse, []byte(input)); err != nil {\n    fmt.Println(\"invalid\")\n}\nfmt.Println(\"valid\")\n// Output: valid\n```\n\nFor more see the [go package documentation](https://godoc.org/github.com/katydid/relaxng)\n\n### RelaxNG Test Suite\n\n[![Build Status](https://travis-ci.org/katydid/relaxng.svg?branch=master)](https://travis-ci.org/katydid/relaxng)\n\n```\npassed: 146\nfailed: 0\nnamespace tests skipped: 13\ndatatypeLibrary tests skipped: 1\nincorrect grammars skipped: 213\n```\n\nSteps:\n - The RelaxNG Test Suite is run through the simplifier which also eliminates all the incorrect grammars.\n - Next these simplified RelaxNG XML Grammars are parsed and translated to Katydid Relapse.\n - Finally the translated Relapse is used to validate the XML.\n\nViewing all tests can be done in the playground by going to this [link](http://katydid.github.io/relaxng/play/index.html?testsuite=049.1.v), which will load the first test, and then clicking the *NextTest* button.\n\n### Example 1\n\nThe Simplified RelaxNG Grammar\n\n```\n\u003cgrammar\u003e\n    \u003cstart\u003e\n        \u003cref name=\"element1\"\u003e\u003c/ref\u003e\n    \u003c/start\u003e\n    \u003cdefine name=\"element1\"\u003e\n        \u003celement\u003e\n            \u003cname\u003efoo\u003c/name\u003e\n            \u003cempty\u003e\u003c/empty\u003e\n        \u003c/element\u003e\n    \u003c/define\u003e\n\u003c/grammar\u003e\n```\n\nis translated to this Relapse Grammar\n\n```\n@element1\n#element1={\n    elem_foo:(\u003cempty\u003e|@ws);\n    (@ws)*;\n}\n#ws=-\u003ewhitespace($string)\n#text=-\u003eanytext($string)\n```\n\n\n### Example 2\n\nThe Simplified RelaxNG Grammar\n\n```\n\u003cgrammar\u003e\n    \u003cstart\u003e\n        \u003cref name=\"element1\"\u003e\u003c/ref\u003e\n    \u003c/start\u003e\n    \u003cdefine name=\"element1\"\u003e\n        \u003celement\u003e\n            \u003cname\u003efoo\u003c/name\u003e\n            \u003cattribute\u003e\n                \u003cname\u003ebar\u003c/name\u003e\n                \u003ctext\u003e\u003c/text\u003e\n            \u003c/attribute\u003e\n        \u003c/element\u003e\n    \u003c/define\u003e\n\u003c/grammar\u003e\n```\n\nis translated to this Relapse Grammar\n\n```\n@element1\n#element1={\n    elem_foo:attr_bar:(@text)*;\n    (@ws)*;\n}\n#ws=-\u003ewhitespace($string)\n#text=-\u003eanytext($string)\n```\n\n### Example 3\n\nThe Simplified RelaxNG Grammar\n\n```\n\u003cgrammar\u003e\n    \u003cstart\u003e\n        \u003cref name=\"element1\"\u003e\u003c/ref\u003e\n    \u003c/start\u003e\n    \u003cdefine name=\"element1\"\u003e\n        \u003celement\u003e\n            \u003cname\u003efoo\u003c/name\u003e\n            \u003cchoice\u003e\n                \u003cgroup\u003e\n                    \u003cattribute\u003e\n                        \u003cname\u003ebar\u003c/name\u003e\n                        \u003cempty\u003e\u003c/empty\u003e\n                    \u003c/attribute\u003e\n                    \u003cref name=\"element2\"\u003e\u003c/ref\u003e\n                \u003c/group\u003e\n                \u003cgroup\u003e\n                    \u003cattribute\u003e\n                        \u003cname\u003ebar\u003c/name\u003e\n                        \u003ctext\u003e\u003c/text\u003e\n                    \u003c/attribute\u003e\n                    \u003cref name=\"element3\"\u003e\u003c/ref\u003e\n                \u003c/group\u003e\n            \u003c/choice\u003e\n        \u003c/element\u003e\n    \u003c/define\u003e\n    \u003cdefine name=\"element2\"\u003e\n        \u003celement\u003e\n            \u003cname\u003ebaz1\u003c/name\u003e\n            \u003cempty\u003e\u003c/empty\u003e\n        \u003c/element\u003e\n    \u003c/define\u003e\n    \u003cdefine name=\"element3\"\u003e\n        \u003celement\u003e\n            \u003cname\u003ebaz2\u003c/name\u003e\n            \u003cempty\u003e\u003c/empty\u003e\n        \u003c/element\u003e\n    \u003c/define\u003e\n\u003c/grammar\u003e\n```\n\nis translated to this Relapse Grammar\n\n```\n@element1\n#element1={\n    elem_foo:(\n        [\n            attr_bar:@ws,\n            @element2\n        ] |\n        [\n            attr_bar:(@text)*,\n            @element3\n        ]\n    );\n    (@ws)*;\n}\n#element2={\n    elem_baz1:(\u003cempty\u003e|@ws);\n    (@ws)*;\n}\n#element3={\n    elem_baz2:(\u003cempty\u003e|@ws);\n    (@ws)*;\n}\n#ws=-\u003ewhitespace($string)\n#text=-\u003eanytext($string)\n```\n\n## Known Issues\n\nThere are quite a few known issues:\n  - Only simplified grammars are supported.\n  - [namespaces are not supported](https://github.com/katydid/relaxng/issues/2).\n  - datatypes: only string and token are currently supported.\n  - datatypeLibraries are not supported.\n\nI don't really intend to fix these, but you never know.\n\n### Only handles simplified relaxng grammars.\n\nhttp://www.kohsuke.org/relaxng/rng2srng/ seems to be quite effective at converting the full spectrum of what is possible within the relaxng grammar to the simplified grammar.\n\n```\njava -jar rng2srng.jar full.rng \u003e simplified.rng\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkatydid%2Fvalidator-go-relaxng","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkatydid%2Fvalidator-go-relaxng","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkatydid%2Fvalidator-go-relaxng/lists"}