代码之家  ›  专栏  ›  技术社区  ›  VSe

如何在rdfa.rnc中添加新的元属性值

  •  1
  • VSe  · 技术社区  · 7 年前

    在RelaxNG紧凑语法模式中:

    https://github.com/validator/validator/blob/master/schema/html5/rdfa.rnc#L51

    我想在中使用一些固定的rdfa属性“property”值进行编辑 meta

    我定义了两个值,如:

    common.attrs.rdfa.property.title = attribute property {"dct:title"}
    common.attrs.rdfa.property.type = attribute property {"dct:type"}
    

    元素,如何在现有rdfa中实现这一点 common.attrs.rdfa.property

    我在尝试添加这些时出错。。

    1 回复  |  直到 7 年前
        1
  •  1
  •   sideshowbarker Miguel Tomás    7 年前

    好的,只要你愿意接受一些限制,这是可行的。以下是操作方法:

    https://github.com/validator/validator/blob/master/schema/html5/meta.rnc#L33 文件,更改 head.inner 为此:

    head.inner =
            (       title.elem
            &       base.elem?
            &       common.inner.metadata
            ),
            meta.property.dct.title.elem,
            meta.property.dct.type.elem
    
    meta.property.dct.title.elem =
            element meta { empty & meta.property.dct.title.attrs }
    meta.property.dct.title.attrs =
            (       meta.attrs.property.dct.title
            &       meta.name.attrs.content
            )
    meta.attrs.property.dct.title =
            attribute property { string "dct:title" }
    
    meta.property.dct.type.elem =
            element meta { empty & meta.property.dct.type.attrs }
    meta.property.dct.type.attrs =
            (       meta.attrs.property.dct.type
            &       meta.name.attrs.content
            )
    meta.attrs.property.dct.type =
            attribute property { string "dct:type" }
    

    <!DOCTYPE html>
    <html>
    <head>
    <title>Test</title>
    <meta property=dct:title content=bar>
    <meta property=dct:type content=bar>
    </head>
    <body></body>
    </html>
    

    但任何不同时具有 <meta property=dct:title content=…> 元素和 <meta property=dct:type content=…> 按这个顺序

    所以最大的限制是不能使用交织( & )但相反,您需要为 meta 元素。

    Interleave In RNC Can relaxng specify an unordered set of elements with the same name, but different attributes? https://www.oasis-open.org/committees/relax-ng/spec-20011203.html#interleave-restrictions

    其要点是:禁止对同名元素进行交叉定义,并在RelaxNG中添加故意设计限制,以使实现更可行。

    因此,上述(重新)定义 头部.内部 表示HTML head 元素允许具有:

      • title 要素
      • base
      • common.inner.metadata script noscript , template , style link
    • 带a的元素 property=dct:title
    • 后跟一个必需的 带a的元素 property=dct:type

    我认为这是最接近你想要的,只要你使用RelaxNG。

    以下子元素:

    也就是说,它不会(至少金不会)告诉你你错过的人有 .

    当声明这个时,我得到了类似数据和字符串错误的东西

    我认为你有这个问题是因为你在这样做:

    common.attrs.rdfa.property.title = attribute property {"dct:title"}
    

    common.attrs.rdfa.property.title = attribute property {string "dct:title"}
    

    也就是说,您需要指定 string

    common.attrs.rdfa.property 就要求文档同时具备这两种功能而言,它永远无法满足您的需求 <元属性=dct:标题内容=> <元属性=dct:类型内容=>

    dct:title dct:type 的值 property