【问题标题】:How to add new meta-property values in rdfa.rnc如何在 rdfa.rnc 中添加新的元属性值
【发布时间】:2017-08-09 10:52:15
【问题描述】:

在此处的 RelaxNG 紧凑语法架构中:

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

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

我定义了两个值,例如:

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

...这两个应该在meta 元素中是强制性的,如何在现有的rdfa common.attrs.rdfa.property 列表中做到这一点?

我在尝试添加这些时遇到错误..

【问题讨论】:

  • @sideshowbarker 这可行吗?
  • 是的,但我还没有时间研究它。我一直希望这里有其他具有 RelaxNG 知识的人能够介入并提供答案。但是如果没有其他人很快会这样做,我会抽出时间来回答它
  • 您遇到什么错误?您不能在 meta 元素上同时设置 common.attrs.rdfa.property.titlecommon.attrs.rdfa.property.type 强制,因为它们都解析为名称为 property 的属性,但只是具有不同的值。根据 RDFa 规范,property 属性可以是“术语”、CURIE 或绝对 URL。那么您是否想要更严格,只允许propertydct:titledct:type
  • @sideshowbarker,两个元元素应该是强制性的,只有选项 dct:title 和 dct:type。声明这一点时,我得到了类似数据和字符串错误的东西......

标签: html w3c-validation relaxng relaxng-compact


【解决方案1】:

好的,只要您愿意接受一些限制,这是可行的。方法如下:

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>

...但是任何没有&lt;meta property=dct:title content=…&gt; 元素和&lt;meta property=dct:type content=…&gt; 元素的文档——并且按这个顺序——都会导致错误。

因此,最大的限制是您不能使用交错 (&amp;),而是需要对 meta 元素进行特定排序。

原因在问题Interleave In RNCCan 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 的设计限制,以使实现更可行。

所以上面对head.inner 的(重新)定义表明HTML head 元素允许有:

  • 交错:
    • 必需的title 元素
    • 可选的base 元素
    • common.inner.metadata,即任意数量的 scriptnoscripttemplatestylelinkmeta 元素
  • 后跟带有property=dct:title 属性的必需meta 元素
  • 后跟带有property=dct:type 属性的必需meta 元素

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

它的另一个限制是,如果其中一个缺失,它不会为您提供非常有用的错误消息。

相反,你只会得到这个:

head 缺少一个或多个 以下子元素:meta

也就是说,它不会(至少 jing 不会)告诉你你缺少的人是property=dct:type

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

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

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

…当你需要做的是:

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

……也就是说,你需要在此处指定string关键字。

但无论如何,就要求文档同时具有&lt;meta property=dct:title content=…&gt;&lt;meta property=dct:type content=…&gt; 元素而言,对common.attrs.rdfa.property 进行更改永远不会得到您想要的。

在那里进行的所有更改都可以帮助您(如果您可以解决语法问题),它将允许 property 属性的特定 dct:titledct:type 值。

【讨论】:

  • 是的,这是预期的。我也面临难以使属性交错并意识到RNC限制。非常感谢..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 2020-05-03
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
相关资源
最近更新 更多