itemtype 不支持嵌套,仅能链式声明;父子关系须通过 itemprop 显式绑定,如 author、affiliation 等官方属性;深层结构推荐使用 json-ld。

itemtype 不能“嵌套”使用,只能链式声明
itemtype 本身不支持嵌套语法,比如 <div itemscope itemtype="https://schema.org/Person"><div itemscope itemtype="https://schema.org/Organization"></div></div> 这种写法看似嵌套,但实际只是两个独立的 itemscope 区域——它们之间没有语义关联,itemtype 不会自动继承或组合。真正起作用的是 itemprop 指向的属性值是否被另一个 itemscope 覆盖。
- 每个
itemscope定义一个独立实体,itemtype只描述它自己 - 父子关系靠
itemprop显式绑定,例如author、publisher、location等属性值本身可以是另一个itemscope - 浏览器和搜索引擎只解析 DOM 树中“属性值节点是否带
itemscope”,不关心 HTML 缩进或标签包裹层级
多层级标记必须用 itemprop 指向另一个 itemscope
想表达 “Article → Author → Organization”,关键不是把 <div itemtype="Organization"> 塞进 <code>Author 的标签里,而是让 Author 的某个 itemprop(如 affiliation 或 worksFor)的值节点自身带 itemscope。
- 正确写法:
<div itemscope itemtype="https://schema.org/Article"><span itemprop="author" itemscope itemtype="https://schema.org/Person"><span itemprop="name">张三</span><span itemprop="affiliation" itemscope itemtype="https://schema.org/Organization"><span itemprop="name">某公司</span></span></span></div> - 错误写法:
<div itemscope itemtype="Article"> <div itemprop="author"><div itemscope itemtype="Person">...</div></div> <div itemscope itemtype="Organization">...</div> </div>—— 后一个Organization和Person无任何属性连接,会被当成孤立实体 - 所有跨层级关系都依赖 Schema.org 官方定义的属性名,比如
author允许值为Person或Organization,但name就不允许再指向另一个itemscope
JSON-LD 比 HTML microdata 更适合深层嵌套
当层级超过两层(如 Article → Author → Address → GeoCoordinates),用 HTML microdata 写起来极易出错:DOM 位置稍偏、itemprop 拼错、漏掉 itemscope,都会导致结构断裂。而 JSON-LD 是纯数据描述,不依赖 HTML 结构。
- 同一份数据,JSON-LD 可直接写成嵌套对象:
{"@type": "Article", "author": {"@type": "Person", "affiliation": {"@type": "Organization", "address": {"@type": "PostalAddress", "geo": {"@type": "GeoCoordinates"}}}}} - HTML microdata 中,
geo属性必须落在address的子元素上,且该子元素还得带itemscope和对应itemtype,缺一不可 - Google Rich Results 测试工具对 JSON-LD 的解析容错率明显更高;microdata 一旦某层
itemprop值为空或类型不匹配,整条链可能被截断
常见错误:用 div/p 包裹 itemscope 导致语义丢失
很多人为了排版方便,在 itemscope 外加一层 <p></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill8714" title="HTML汇报生成器"><img
src="https://img.php.cn/upload/skill/000/000/081/179220974213190.jpg" alt="HTML汇报生成器" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill8714" title="HTML汇报生成器" class="overflowclass">HTML汇报生成器</a>
<p class="overflowclass">🚀 不用写一行代码!把项目总结、工作汇报、研究报告、技术文档、提案、数据看板直接变精美HTML。12种主题 × 11种背景动效 × 9种鼠标特效 × 10种边框样式 × 实时调色器 × 毛玻璃卡片 × PDF导出,生成后还能自由调色,零门槛AI直出。触发词:项目总结、工作汇报、PPT、生成报告、做个总结、HTML文档、数据报告、流程文档、会议纪要、技术文档、研究报告、数据看板、提案、做个展示页、帮我做个汇报、文档生成。</p>
</div>
<a rel="nofollow" href="/xiazai/skill8714" title="HTML汇报生成器" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div> 或 <div>,但这样会导致属性值脱离上下文。例如:
<ul>
<li>错误:<code><p><span itemscope itemtype="Person"><span itemprop="name">李四</span></span></p> —— name 的值是 李四,但 p 标签本身不是 itemprop 的合法容器,某些解析器会忽略这层包装
<h2 itemscope itemtype="Person"><span itemprop="name">李四</span></h2>,或用 <span></span> + itemprop 组合<li> 外再套 <div> 来包 <code>itemscope,li 本身就是合法容器,额外包裹反而干扰列表语义
真正难的不是写几层 itemscope,而是每层 itemprop 是否严格匹配 Schema.org 定义的预期类型,以及值节点是否确实被它直接包裹——差一个标签层级,机器就认不出来。










