我一直在阅读BaseX's documentation,我发现它们提供了令牌索引以及属性令牌。但是,我不清楚两者之间有什么区别。
属性似乎是我所知道的常规属性:
<node attribute="value"/>
但是,对于令牌,文档为:
在许多XML方言中,例如HTML或DITA,存储了多个令牌 在属性值中。
所以看起来好像是属性值?所以,像这样:
<node attribute="token1 token2"/>
如果是这种情况,那么这两种情况下的索引是什么?如果属性索引改进了等等检查,例如
//country[@car_code = 'J']
并且令牌索引改进了包含检查,例如
//div[contains-token(@class, 'row')]
不是令牌索引,而是一个高级属性索引,使用多个值?或者我错过了什么?何时使用这一个或另一个,它们组合起来有用吗?
答案 0 :(得分:2)
不幸的是, token 在XPath,XML,XML Schema,DTD和其他相关技术中的不同上下文中意味着一些不同的东西,这些可能会使术语出现时有点不清楚。
在这里,他们指的是由XML名称字符组成的字符串意义上的 token 。
在可以定义属性的许多方式中,一种情况是具有由空格分隔的多个令牌,没有赋予这种令牌的顺序的含义。举一个你引用的例子:
//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">
不是令牌索引,而是一个高级属性索引,使用多个值?
是。非常有用的一个。为包含值作为标记的属性编写测试,以便它匹配上面应该匹配的四种情况中的每一种,但是它不应该匹配的两种情况中的任何一种都非常繁琐,并且在很多情况下都是如此。这种需求出现了很多情况(例如上面的例子与CSS选择器div.row
匹配)。
另外,请注意,虽然此函数的一个非常常见的用例是属性值,但它可以对任何字符串进行操作,因此它也可以是元素文本,另一个字符串函数的结果,整个导入的文档等。
何时使用其中一个
真的,这是你关心的问题。是您的查询&#34;我希望匹配<div>
属性为class
&#34;的所有"row"
或者是您的查询&#34;我想匹配具有<div>
属性的所有class
,其中包含令牌"row"
。在考虑如何使用class
的HTML或XHTML中,我们大多数时间都可能处于后一种情况。
它们组合起来有用吗?
在某种程度上,它们已经在组合中;您正在使用[]
和@
来标识具有特定属性的节点,然后使用contains-token
函数指定您在过滤这些属性的值时所执行的操作。
我们通常不会关心同一属性进行=
测试和contains-token
测试,因为=
通常就足够了;如果我们要求属性的全部内容必须是什么,那么任何对令牌的要求都是由此引起的。当然,编码中可能会发生各种令人惊讶的罕见情况,特别是当我们将两个或多个单独的标准放在一起时。让两种类型处理不同的属性也更常见;
//a[@href = 'http://example.net/][contains-token(@class, 'cool')]
会在一个属性上使用=
而在另一个属性上使用contains-token
。
(同样,真的contains-token
不是一种索引,它是一个对字符串起作用的字符串函数,在索引中通常很有用。)
答案 1 :(得分:1)
术语“名称标记”源自在DTD中声明的SGML属性,如
<!ATTLIST your-element an-attribute-name NMTOKEN #IMPLIED>
或像这样的枚举属性值声明
<!ATTLIST your-element an-attribute-name (value1|value2) #IMPLIED>
(或类似于属性类型ID
,IDREF
,NAME
,NAMES
,NMTOKENS
等,其中NMTOKEN
属性可以以数字开头,但NAME
一定不能。
在XML实例中,可以使用名称标记或枚举属性,如下所示
<your-element an-attribute="whatever">
(对于第一个例子),或
<your-element an-attribute="value1">
(第二次)。
在SGML中,枚举属性可以用这种
这样的简短格式编写<your-element value1>
例如。如果value1
在DTD中的所有名称标记中都是唯一的,则可以省略属性 name 。
HTML具有所谓的布尔属性,它们基本上是SGML枚举属性,附加条件是属性值必须与属性名称相同。例子:
<div hidden>
<option selected>
等。 HTML有一个额外的怪癖,它可能会将true
/ false
公开为DOM属性值。
那就是说,您链接的文档说明了
尽可能重写XQuery函数
fn:contains-token
,fn:tokenize
和fn:idref
以进行索引访问。