XML属性和XML令牌之间有什么区别?

时间:2017-09-15 09:37:24

标签: xml xpath indexing basex

我一直在阅读BaseX's documentation,我发现它们提供了令牌索引以及属性令牌。但是,我不清楚两者之间有什么区别。

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

<node attribute="value"/>

但是,对于令牌,文档为:

  

在许多XML方言中,例如HTML或DITA,存储了多个令牌   在属性值中。

所以看起来好像是属性值?所以,像这样:

<node attribute="token1 token2"/>

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

//country[@car_code = 'J']

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

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

不是令牌索引,而是一个高级属性索引,使用多个值?或者我错过了什么?何时使用这一个或另一个,它们组合起来有用吗?

2 个答案:

答案 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>

(或类似于属性类型IDIDREFNAMENAMESNMTOKENS等,其中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-tokenfn:tokenizefn:idref以进行索引访问。