Schemata
(Dieser Entwurf wird kontinuierlich verändert. Eine finale Version wird erst mit Version 1.0 veröffentlicht.)
XML Schema
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://librml.org/schema"
xmlns:libRML="http://librml.org/schema"
attributeFormDefault="unqualified"
elementFormDefault="qualified"
version="0.4.0">
<xs:element name="libRML" type="libRML:libRMLType" />
<!-- libRMLType - Container for all -->
<xs:complexType name="libRMLType">
<!-- Contains only 1 subelement and a string 'version' -->
<xs:sequence>
<xs:element type="libRML:ItemType" name="item" minOccurs="1" maxOccurs="1" />
</xs:sequence>
<xs:attribute type="xs:string" name="version" />
</xs:complexType>
<!-- itemType - has many actions and some attributes -->
<xs:complexType name="ItemType">
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element type="libRML:ActionType" name="action" />
</xs:sequence>
<xs:attribute type="xs:NMTOKEN" name="id" />
<xs:attribute type="xs:anyURI" name="tenant" />
<xs:attribute type="xs:boolean" name="mention" />
<xs:attribute type="xs:boolean" name="sharealike" />
<xs:attribute type="xs:boolean" name="commercialuse" />
<xs:attribute type="xs:boolean" name="copyright" />
<xs:attribute type="xs:string" name="template" />
<xs:attribute type="xs:anyURI" name="usageguide" />
</xs:complexType>
<!-- ActionType - has many restrictions and some attributes -->
<xs:complexType name="ActionType">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element type="libRML:RestrictionType" name="restriction" />
</xs:sequence>
<xs:attribute name="type" use="required">
<xs:simpleType>
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="displaymetadata" />
<xs:enumeration value="read" />
<xs:enumeration value="run" />
<xs:enumeration value="lend" />
<xs:enumeration value="download" />
<xs:enumeration value="print" />
<xs:enumeration value="reproduce" />
<xs:enumeration value="modify" />
<xs:enumeration value="reuse" />
<xs:enumeration value="distribute" />
<xs:enumeration value="publish" />
<xs:enumeration value="archive" />
<xs:enumeration value="index" />
<xs:enumeration value="move" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute type="xs:boolean" name="permission" use="required" />
</xs:complexType>
<!-- RestrictionType -->
<xs:complexType name="RestrictionType">
<xs:attribute name="type" use="required">
<xs:simpleType>
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="parts" />
<xs:enumeration value="group" />
<xs:enumeration value="age" />
<xs:enumeration value="location" />
<xs:enumeration value="date" />
<xs:enumeration value="duration" />
<xs:enumeration value="count" />
<xs:enumeration value="concurrent" />
<xs:enumeration value="watermark" />
<xs:enumeration value="quality" />
<xs:enumeration value="agreement" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute type="xs:date" name="fromdate" />
<xs:attribute type="xs:date" name="todate" />
<xs:attribute type="xs:positiveInteger" name="maxresolution" />
<xs:attribute type="xs:string" name="maxbitrate" />
<xs:attribute type="xs:positiveInteger" name="count" />
<xs:attribute type="xs:positiveInteger" name="sessions" />
<xs:attribute type="xs:Name" name="inside" />
<xs:attribute name="subnet">
<xs:simpleType>
<xs:restriction base="xs:string">
<!-- Regex for IPV4 incl. CDIR -->
<xs:pattern value="((1?\d?\d|2[0-4]\d|25[0-5])\.){3}(1?\d?\d|2[0-4]\d|25[0-5])/(3[0-2]|[12]?\d)" />
<!-- Regex for IPv6 -->
<xs:pattern value="(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,4}){1,6}|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[01][0-9]|[1-9][0-9]|[0-9])"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute type="xs:Name" name="outside" />
<xs:attribute type="xs:string" name="watermarkvalue" />
<xs:attribute type="xs:positiveInteger" name="duration" />
<xs:attribute type="xs:positiveInteger" name="minage" />
<xs:attribute type="xs:positiveInteger" name="maxage" />
<xs:attribute type="xs:boolean" name="required" />
<xs:attribute type="xs:positiveInteger" name="parts" />
<xs:attribute type="xs:NMTOKENS" name="groups" />
</xs:complexType>
</xs:schema>JSON Schema
{
"$defs": {
"actions_type": {
"items": {
"additionalProperties": false,
"properties": {
"permission": {
"type": "boolean"
},
"restrictions": {
"$ref": "#/$defs/restrictions_type"
},
"type": {
"enum": [
"displaymetadata",
"read",
"run",
"lend",
"download",
"print",
"reproduce",
"modify",
"reuse",
"distribute",
"publish",
"archive",
"index",
"move"
],
"type": "string"
}
},
"required": [
"permission",
"type"
],
"type": "object"
},
"minItems": 0,
"type": "array"
},
"restrictions_type": {
"items": {
"additionalProperties": false,
"properties": {
"count": {
"minimum": 1,
"type": "integer"
},
"duration": {
"minimum": 1,
"type": "integer"
},
"fromdate": {
"format": "date",
"type": "string"
},
"groups": {
"items": {
"type": "string"
},
"type": "array"
},
"inside": {
"items": {
"type": "string"
},
"type": "array"
},
"maxage": {
"minimum": 1,
"type": "integer"
},
"maxbitrate": {
"minimum": 1,
"type": "integer"
},
"maxresolution": {
"minimum": 1,
"type": "integer"
},
"minage": {
"minimum": 1,
"type": "integer"
},
"outside": {
"items": {
"type": "string"
},
"type": "array"
},
"parts": {
"minimum": 1,
"type": "integer"
},
"permission": {
"type": "boolean"
},
"property": {
"type": "boolean"
},
"sessions": {
"minimum": 1,
"type": "integer"
},
"subnet": {
"oneOf": [
{
"pattern": "^((1?\\d?\\d|2[0-4]\\d|25[0-5])\\.){3}(1?\\d?\\d|2[0-4]\\d|25[0-5])/(3[0-2]|[12]?\\d)$",
"type": "string"
},
{
"pattern": "^(([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}|([0-9A-Fa-f]{1,4}:){1,7}:|([0-9A-Fa-f]{1,4}:){1,6}:[0-9A-Fa-f]{1,4}|([0-9A-Fa-f]{1,4}:){1,5}(:[0-9A-Fa-f]{1,4}){1,2}|([0-9A-Fa-f]{1,4}:){1,4}(:[0-9A-Fa-f]{1,4}){1,3}|([0-9A-Fa-f]{1,4}:){1,3}(:[0-9A-Fa-f]{1,4}){1,4}|([0-9A-Fa-f]{1,4}:){1,2}(:[0-9A-Fa-f]{1,4}){1,5}|[0-9A-Fa-f]{1,4}:((:[0-9A-Fa-f]{1,4}){1,6})|:((:[0-9A-Fa-f]{1,4}){1,7}|:))(/(12[0-8]|1[01][0-9]|[1-9]?[0-9]))$",
"type": "string"
}
]
},
"todate": {
"format": "date",
"type": "string"
},
"type": {
"enum": [
"parts",
"group",
"age",
"location",
"date",
"duration",
"count",
"concurrent",
"watermark",
"quality",
"agreement"
],
"type": "string"
},
"watermarkvalue": {
"format": "uri",
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
},
"minItems": 0,
"type": "array"
}
},
"$id": "https://librml.org/schema/librml.json",
"$schema": "https://json-schema.org/draft/2020-12/schema#",
"additionalProperties": false,
"description": "LibRML schema version 0.4.0",
"properties": {
"actions": {
"$ref": "#/$defs/actions_type"
},
"commercialuse": {
"type": "boolean"
},
"copyright": {
"type": "boolean"
},
"id": {
"type": "string"
},
"mention": {
"type": "boolean"
},
"sharealike": {
"type": "boolean"
},
"template": {
"type": "string"
},
"tenant": {
"format": "uri",
"type": "string"
},
"usageguide": {
"format": "uri",
"type": "string"
}
},
"type": "object"
}