XML 属性和 XML 标记有什么区别?

What is the difference between an XML attribute and an XML token?

我通读了 BaseX's documentation,发现它们提供了一个标记索引和一个属性标记。但是,我不清楚两者之间的区别。

属性似乎是我所知道的常规属性:

<node attribute="value"/>

但是,对于代币,文档如下:

In many XML dialects, such as HTML or DITA, multiple tokens are stored in attribute values.

所以它几乎看起来好像标记是属性的值?所以,像这样:

<node attribute="token1 token2"/>

如果是这样,那么在这两种情况下索引的是什么?如果属性索引改进了等式检查,例如

//country[@car_code = 'J']

并且令牌索引改进了包含检查,例如

//div[contains-token(@class, 'row')]

令牌索引不是简单的高级属性索引,可以处理多个值吗?或者我错过了什么?什么时候会使用一个或另一个,它们组合起来有用吗?

不幸的是 token 在 XPath、XML、XML Schema、DTD 和其他相关技术中的不同上下文中有一些不同的含义有点不清楚这个词是什么时候出现的。

这里他们指的是 token 是指由 XML 名称字符组成的字符串。

在可以定义属性的多种方式中,一种情况是多个标记由空格分隔,这些标记的顺序没有任何意义。以您引用的示例之一为例:

//div[contains-token(@class, 'row')]

这将匹配每个:

<div class="row">
<div class="row important">
<div class="important row">
<div class="important        row               warning">

它不会匹配任何一个:

<div class="rows">
<div class="arrow">

isn't a token index then simply an advanced attribute index, working with multiple values?

是的。一个非常有用的。为包含值作为标记的属性编写测试,以便它匹配上面应该匹配的四种情况中的每一种,但是它不应该匹配的两种情况中的 none 会非常繁琐,并且在很多情况下这种需求经常出现(例如上面的例子匹配 CSS 选择器 div.row)。

此外,请注意,虽然此函数的一个非常常见的用例是属性值,但它可以对任何字符串进行操作,因此它也可以是元素文本、另一个字符串函数的结果、整个导入的文档,等等

When would one use the one or the other

真的是看你在乎什么了。您的查询是 "I want to match all <div>s that have a class attribute of "row"" 还是您的查询“我想匹配所有具有包含标记 "row"class 属性的 <div>。在 HTML 中或XHTML 考虑到 class 的使用方式,大多数时候我们可能会采用后一种情况。

and are they ever useful in combination?

在某种程度上,它们已经结合在一起了;您正在使用 []@ 来识别具有特定属性的节点,然后使用 contains-token 函数来指定您在过滤这些属性的值时所做的操作。

我们通常不会关心对同一属性同时进行 = 测试和 contains-token 测试,因为通常 = 就足够了;如果我们要求属性的全部内容必须是什么,那么对存在什么标记的任何要求都包含在其中。当然,编码中可能会发生各种令人惊讶的罕见情况,尤其是当我们将两个或多个单独的标准放在一起时。两种类型都处理不同的属性也更常见;

//a[@href = 'http://example.net/][contains-token(@class, 'cool')]

将在一个属性上使用 =,在另一个属性上使用 contains-token

(再次强调,contains-token 并不是一种索引类型,它是一个作用于字符串的字符串函数,在索引中经常有用)。

术语 "name token" 源自在这样的 DTD 中声明的 SGML 属性

<!ATTLIST your-element an-attribute-name NMTOKEN #IMPLIED>

或像这样的枚举属性值声明

<!ATTLIST your-element an-attribute-name (value1|value2) #IMPLIED>

(或类似于属性类型 IDIDREFNAMENAMESNMTOKENS 等,其中 NMTOKEN 属性可以以数字开头,但 NAME 不能)。

在XML实例中,名称标记或枚举属性可以如下使用

<your-element an-attribute="whatever">

(对于第一个例子),或

<your-element an-attribute="value1">

(第二次)。

在 SGML 中,枚举属性可以写成这样的短格式语法

<your-element value1>

例如。属性 name 可以省略,前提是 value1 在 DTD 中的所有名称标记中是唯一的。

HTML 具有所谓的 布尔属性 ,它们基本上是 SGML 枚举属性,附加条件是属性值必须与属性名称相同。示例:

<div hidden>
<option selected>

等HTML 有一个额外的怪癖,它可能会将 true/false 公开为 DOM 属性值。

就是说,您链接的文档是这样说的

The XQuery functions fn:contains-token, fn:tokenize and fn:idref are rewritten for index access whenever possible.