Regular expression in Relax NG Compact syntax

ถ้าอยากกำหนดรูปแบบข้อมูลที่จะอนุญาตให้ใส่ใน XML ของเรา ลงไปใน schema language เพื่อที่จะได้ตรวจได้โดย XML validator ใน Relax NG นี่ เราไปยืม pattern จาก W3C XML Schema datatypes มาใช้ได้

โดยตัว pattern นี่ มันก็คือ regular expression น่ะแหละ

ใช้งี้:

xsd:string { pattern = "regular_expression_here" }

เช่น ถ้าเราเขียน:

# ยืม datatypes ของ W3C XML Schema มาใช้
datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"

# กำหนดรูปแบบข้อมูลเอง
Percent.data = ( xsd:string{ pattern = "(100|[1-9]?[0-9])[%]" } )

Style = element font {
  attribute weight { Percent.data }, # เอามาใช้ตรงนี้
  attribute color { "green" | "greener" }, # ถ้าแค่นี้ ไม่ต้องใช้ pattern ก็ได้
  text
}

ตัวอิลิเมนต์ font ก็จะเอาไปใช้ได้ประมาณนี้:

<font color="greener" weight="80%">bact'</font>

นี่ไม่ได้เปิดหนังสือดู อาศัยมั่ว ๆ หาเอาจากเน็ต เลยยังไม่แน่ใจว่า pattern เนี่ย มันใช้กับอย่างอื่นนอกจาก xsd:string ได้รึเปล่า ?

Co-Occurrence Constraints in RELAX NG

วิธีกำหนดเงื่อนไข &ldquoปรากฏร่วม” ใน RELAX NG: ถ้าค่าของโหนดนี้ เป็นแบบนี้ ตัวข้อมูลที่เหลือจะต้องเป็นแบบนี้ … เช่น ในอิลิเมนต์ person ถ้าเกิดแอตทริบิวต์ type มีค่าเป็น “author” ตัวอิลิเมนต์ person จะต้องมีอิลิเมนต์ลูก ชื่อ dead ด้วยนะ; แต่ถ้าแอตทริบิวต์ type มีค่าเป็น “character” ตัวอิลิเมนต์ลูกที่ต้องมี ก็จะเปลี่ยนไป

เงื่อนไขลักษณะนี้ ทำด้วย DTD ไม่ได้เลย. ส่วน W3C XML Schema นี่ พอทำได้บ้าง แต่ยุ่งยาก

คำถามก็คือ แล้วทำไมไม่สร้างอิลิเมนต์แยกกันไปเลยล่ะ ? -_-” อย่างในตัวอย่างข้างบน ก็ทำเป็นสองอิลิเมนต์ไปเลย ก็น่าจะได้รึเปล่า ? หรือว่าทำแบบนี้แล้ว มันทำให้ดูทั่ว ๆ ไป (generic) มากขึ้น ?

อันนี้ก็ต้องแล้วแต่คนออกแบบ schema แล้วล่ะ ว่าจะเอาไง. ตัว schema language (อย่าง Relax NG) นั้น เปิดช่องให้ทำได้, แต่จะทำไม่ทำก็แล้วแต่.