传知_5_xml_dtd_

XML文档都是一种跨平台的数据交换方式,它本质上又是一种文本文件,而文本文件都涉及换行字符的问题。ASC2标准指定了两个行尾控制字符:回车符(CR,即/r换行符(LF,即/n),但具体到实际操作系统又各有区别,就目前的主流操作系统来看,主要有如下3种换行符:

Windows平台:          以回车符(CR)和换行符(LF)的组合存储换行,这对字符与打字机设置新行的动作非常相似

UNIXLinux平台:以换行符(LF)存储换行

Macintosh平台:以回车符(CR)存储换行

XML统一以换行符(LF)存储换行

 

Xml文件只是一个静态的文件,无作为,

可对外提供一些信息,但不能完成任何的动态行为。

HTML主要侧重于显示数据

XML最大的可扩展,侧重于传输和存储数据

 

XMLJAVAEE中的应用:

a.XML配置文件

b.简化数据交换格式

c.Web Service(服务,粗粒度)

       SOA(面向服务的架构)

XML在某些方面的替代:

1XML配置文件 struct 2 / Spring EJB等等。现在都可改为使用Annotation

         。但两者的本质相同,只是数据的载体不同而已

2.数据交换方面。XML有一个很多的替代解决方案:JSON .

         Xml能传的信息json一样能传,并且所需的数据传输量更小

 

3XML文档:  [W1] 

         Malformed,不满足4个基本规则

         Well formed 满足4个基本规则,但没有语义约束,或有语义约束但不pi

         Valid:          满足4个基本规则,语义约束

浏览器区分XML,只区分是否格式良好

 

实际应用时: XML + 语义约束

[W2] 

XML声明 不是必须的

<?xml ?>

Version = “1.0”  这个属性是必须的,并且通常此属性都排在第一位

Encoding = “”  此属性告诉XML处理工具,用怎样的字符集来对XML文档进行解码

                            此属性应与保存此文档时所用的字符集相同

                            默认值是utf-8

standalone  属性说明文档是否独立  standalone = “yes

 

合法的标签名,

子元素之间可以重复,有顺序。

属性之间不可以重复,无序。

 

字符数据:

开始标签和结束标签之间的一段文本。   (HTML会把多个连续的空格字符减为一个,但XML则会保留所有空白)

 

<! [CDATA[   ]]>   cdata区应用多

cdata区的起始和结束处有和没有空格和换行字符是有区别的。

cdata区内部不能出现字符串” ]]>”

<!--  [X3] --> 

 

css显示

<?xml-stylesheet type=”text/csshref=”book.css” ?>

 

XML DOM: 

                    xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue

·  xmlDoc -由解析器创建的 XML 文档

·  getElementsByTagName("to")[0] - 第一个 <to> 元素

·  childNodes[0] - <to> 元素的第一个子元素(文本节点)

·  nodeValue - 节点的值(文本本身)

function parseXML()

{

try //Internet Explorer

  {

  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");

  }

catch(e)

  {

  try //Firefox, Mozilla, Opera, etc.

    {

    xmlDoc=document.implementation.createDocument("","",null);

    }

  catch(e)

    {

    alert(e.message);

    return;

    }

  }

xmlDoc.async=false;

xmlDoc.load("note.xml");

 

document.write("<td>");

document.write(

x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);

document.write("</td>");

 

 

 

 

 

XSL - 不仅仅是样式表语言,XSL 包括三部分:

XSLT      一种用于转换 XML 文档的语言。   [W4] 

XPath     一种用于在 XML 文档中导航的语言。

XSL-FO 一种用于格式化 XML 文档的语言。

 

XSLT 元素参考:

元素 描述 IE N

apply-imports 应用来自导入样式表中的模版规则。 6.0  

apply-templates 向当前元素或当前元素的子元素应用模板。 5.0 6.0

attribute 向元素添加属性。 5.0 6.0

attribute-set 创建命名的属性集。 6.0 6.0

call-template 调用一个指定的模板。 6.0 6.0

choose <when>以及<otherwise>协同使用,来表达多重条件测试。 5.0 6.0

comment 在结果树中创建注释节点。 5.0 6.0

copy 创建当前节点的一个备份(无子节点及属性)。 5.0 6.0

copy-of 创建当前节点的一个备份(带有子节点及属性)。 6.0 6.0

decimal-format 定义当通过 format-number() 函数把数字转换为字符串时,所要使用的字符和符号。 6.0  

element 在输出文档中创建一个元素节点。 5.0 6.0

fallback 假如处理器不支持某个XSLT元素,规定一段备用代码来运行。 6.0  

for-each 遍历指定的节点集中的每个节点。 5.0 6.0

if 包含一个模板,仅当某个指定的条件成立时应用此模板。 5.0 6.0

import 用于把一个样式表中的内容倒入另一个样式表中。 6.0 6.0

include 把一个样式表中的内容包含到另一个样式表中。 6.0 6.0

key 声明一个命名的键。 6.0 6.0

message 向输出写一条消息(用于错误报告)。 6.0 6.0

namespace-alias 把样式表中的命名空间替换为输出中不同的命名空间。 6.0  

number 测定当前节点的整数位置,并对数字进行格式化。 6.0 6.0

otherwise 规定 <choose> 元素的默认动作。 5.0 6.0

output 定义输出文档的格式。 6.0 6.0

param 声明一个局部或全局参数。 6.0 6.0

preserve-space 用于定义保留空白的元素。 6.0 6.0

processing-instruction 生成处理指令节点。 5.0 6.0

sort 对结果进行排序。 6.0 6.0

strip-space 定义应当删除空白字符的元素。 6.0 6.0

stylesheet 定义样式表的根元素。 5.0 6.0

template 当指定的节点被匹配时所应用的规则。 5.0 6.0

text 通过样式表生成文本节点。 5.0 6.0

transform 定义样式表的根元素。 6.0 6.0

value-of 提取选定节点的值。 5.0 6.0

variable 声明局部或者全局的变量。 6.0 6.0

when 规定 <choose> 元素的动作。 5.0 6.0

with-param 规定需被传入某个模板的参数的值。 6.0 6.0

      

 

使用Template元素定义模板:   match="/" [W5] 

book.xml   book.xslt

使用apply-tempates处理子节点:[W6] 

       Xml   xsl

使用value-of输出节点内容:DEMO

转换包含子元素的节点               

转换属性

转换处理指令

转换注释  select="comment()"

Pi配节点的模式: 

/  //  .  ..  []

Select="node()"  Pi配除属性和XML文档根之外的所有节点

Select="text()"   Pi配当前上下文中的所有文本节点

Select="comment()"  Pi配当前上下文中的所有注释

Select="id()"   只有此属性声明为ID类型时,id()表达式才有效

Mode属性:  DEMO

只有当<apply-templates ../>mode属性和<template ../>mode属性相同时,此模板规则才会生效

 

XSLT转换分类:

服务端转换  Xalan  Saxon DEMO

客户端转换

流程控制元素:

分支处理 if  choose

循环控制 demo

排序控制 DMEO

 

控制空白:

<preserve-space element=""/>保留空白

<strip-space element=""/>删除空白

 

创建元素和属性:

使用element创建元素  DEMO

属性值模板  DEMO

使用attribute创建属性 DEMO

命名属性集  DEMO

创建文本  DEMO

创建处理指令 DEMO

创建注释  <xsl:comment>  静态注释内容:<xsl:value-of select=""f >

复制  DEMO

输出格式化数值  DEMO

 

变量和参数:

<variable ../>  定义变量

<param ../> 定义参数

使用元素体指定值 DEMO

全局的和局部的变量和参数  DEMO

改变参数值 DEMO

 

命名模板,提高代码复用率 DEMO

 

使用import导入 DEMO [W8] 

使用inckude包含 DEMO [W9] 

 

指定输出格式:

转换XML文档的相关格式 DEMO [W10] 

转换HTML文档的相关格式 DMEO  [W11] 

 

XSLT 函数:

 

XQuery 1.0XPath 2.0 以及 XSLT 2.0 共享相同的函数库。

名称

描述

current()

返回当前节点的节点集。 [W12] 

document()

用于访问外部 XML 文档中的节点。DEMO

element-available()

检测 XSLT 处理器是否支持指定的元素。 DEMO

format-number()

把数字转换为字符串。DEMO

function-available()

检测 XSLT 处理器是否支持指定的函数。DEMO

generate-id()

返回唯一标识指定节点的字符串值。DEMO

Key()

key()检索以前使用 <xsl:key> 语句标记的元素。DEMO

 

node-set

将树转换为节点集。产生的节点集总是包含单个节点并且是树的根节点。

system-property()

返回系统属性的值。DEMO

unparsed-entity-uri()

返回未解析实体的 URI DEMO

 

XSLT2.0常用新功能 [W13] 

分组  for-each-group DEMO

多文档输出 result-document DEMO

字符映射  [W14] character-mappting DEMO

Value-of元素的改进  DEMO

数据类型在邦定(用处不大) DEMO

正则表达式        <xsl:analyze-string>  DEMO

用户自定义han <xsl:function> DMEO

Xpath[W15] :

     节点(Node

XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

下面列出了最有用的路径表达式:

表达式

描述

nodename

选取此节点的所有子节点

/

从根节点选取

//

从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置[W16] 

.

选取当前节点

..

选取当前节点的父节点 parent::node[X17] ()

@

选取属性[W18] 

谓语(Predicates

路径表达式 结果

/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。

/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。 /bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。 /bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。    book[position() = last()]

//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。

//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng lang 属性。 /bookstore/book[price>35.00] 选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00

/bookstore/book[price>35.00]/title 选取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值须大于 35.00

轴(axis

Attribute        book/@isbn 等同于 child::book/attribute::isbn

Child     选取当前节点的所有子节点 ../book 等同于parent::node()/child::book

Parent    当前节点的父节点

Self  选取当前节点本身

选取未知节点

通配符

描述

*

匹配任何元素节点

@*

匹配任何属性节点

node()

匹配任何类型的节点

     选取若干路径

路径表达式 结果

//book/title | //book/price 选取所有 book 元素的 title price 元素。

//title | //price 选取所有文档中的 title price 元素。

/bookstore/book/title | //price 选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素。

 

位置路径表达式

位置路径可以是绝对的,也可以是相对的。

绝对路径起始于正斜杠( / ),而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:

绝对位置路径:

/step/step/...

相对位置路径:

step/step/...
 
算术运算符  div  mod 
比较运算符
逻辑运算符  or  and 
 

Xpath2.0新增加的表达式:

         For表达式  DEMO  xmlDEMO

         If表达式 DEMO

         Some/every表达式  some是任一项满足,every是全部项都要满足 DEMO

Xpath2.0的类型支持:

   可以显式地指定某项的值的数据类型,基于Schema内置类型的 DEMO

XQuery[W19]    DEMO  XML

上下文项表达式  doc("books.xml")/bookstore/book/title

谓语  doc("books.xml")/bookstore/book[price<30]

         直接量: xs:string

         变量引用:$book

         圆括号表达式:

         调用han数:

         序列表达式:   

                   构造序列

1.          使用逗号 (1,2,3,4)

2.          使用to关键字  DEMO

过滤表达式  DEMO  (3 to 8)[.mod 3 eq 0]

组合节点序列

1.        并集  DEMO       

2.        交集   DEMO

3.        减法   DEMO

算术表达式:

         Div   idiv 整除 mod 求余

比较表达式:   

         值比较 eq 等于  ne 不等于  lt 小于  le 小于等于  gt 大于  ge 大于等于

         通用比较  = 

         节点比较  is  >>  <<

逻辑表达式:

         1 eq 1 and 2 eq 2  返回true

         1 eq 1 or 2 eq 2  返回true

         构造器:

                   直接构造   <author>{$book/author}</author>

                   计算构造[W20]  

         FLWOR表达式:  DEMO

                  For let where order by return 最常用 功能强大的

         If表达式: DEMO

         Some/every表达式:  some  every

         与序列类型有关的表达式:       

                   Instance of     2 instance of xs:integer   返回true

                   Typeswitch          DEMO

                   Cast           DEMO

                   Castable  cast经常一起使用,在使用cast进行实际类型转换之前,应该先使用castable判断此变量是否可以转换为对应的类型       “123” castable  as  xs:string

 

         XQJ (类似于JDBC)   DEMO

 

 

 

处理指令:

         和声明的语法相同

         <?处理指令名 attr1=val1 attr2=val2 ?>

常用指令:

属性和元素:从简洁性的角度来看,属性比子元素要简单得多,

         Spting 1.1大量使用子元素写法

         Spring1.2大量使用属性写法

从要扩展性的角度看,子元素写法更具有更好的可扩展性

W3C建议除data  其他的都使用子元素

 

两种主要语义约束:

         DTD          

         XML Schema         

DTD是早期的,简单,但功能较弱,Schema是现在的,强大,但比较复杂

 

引入DTD

内部DTD:  XML文档内定义DTD  <!DOCTYPE 根元素名 [  ]  > DEMO

外部DTD:  XML文档外定义   <!DOCTYPE 根元素名 SYSTEM  “dtd文档的uri”  >  DEMO  book.dtd

公用DTD:  XML文档外定义  <!DOCTYPE 根元素名  PUBLIC   “dtd的唯一标识” “dtd文档的uri”  >  DEMO

 

DTD定义:

<!ELEMENT 元素名 元素类型[X21]  >      定义元素

         无序子元素  <!ELEMENT 计算机 (书名|作者|价格)+  >

<!ATTLIST       定义属性

<!ENTITY                  定义实体

<!NOTATION   定义符号

这四种元素彼此独立

 

定义属性:

         属性必须依附于元素才能存在

         <ATTLIST  可以为一个元素定义一个或多个属性。

         <!ATTLIST 元素名

属性名 属性类型 [元素对属性的约束] [默认值]

属性名 属性类型 [元素对属性的约束] [默认值] ..

> 

         两种情况必须指定默认值     没有约束,或约束为#FIXED

         两咱情况不能指定默认值     约束为#IMPLIED  #REQUIRED

                   #FIXED  表示某些固定值

                            属性 CDATA  #FIXED  “sdfsdfsdf”

                            属性 CDATA  “dsfsdf”    <!—如果不设置其属性,就默认用这个,如果设置了.....-->

 

属性类型:

#REQUIRED    必需的属性[X22]     <!ATTLIST 作者 地址 CDATA  #REQUIRED>

#IMPLIED                 可有可无的属性

#FIXED             其属性的值是固定的,无须为其分配此属性,自动的  <!ATTLIST 作者 地址 CDATA #FIXED "广州">

 

CDATA字符串   CDATANMTOKEN区别

NMTOKEN   要求属性值是标识符字符串[X23]  (#不行 空格不行 ....特殊符号不可以)

NMTOKENS  要求属性值是多个NMTOKEN  用空格隔开

(en1 | en2 | en3 .) 枚举  (若有#PCDATA时,要把#PCDATA放到最前面) 

<!ATTLIST 水果 类型  (苹果||桔子)  #REQUIRED>

ID 要求属性值是标识符, 其值不能重复   action.xml  action.dtd

IDREF      要求属性必须引用到一个已经已有的ID ,多个值之间用空格隔开

IDREFS

 

XML预置的实体引用:

&lt             <

&gt            [X24] >

&amp;       &

&apos;       ;       

&quot;      

 

定义实体:

         用一个字符串代表另一个字符串

         <!ENTITY cs项目冲刺班”> 

         这样用这个实体 &cs; (在XML中使用实体)

         普通实体 <!ENTITY 实体名 "实体值">    &实体;   普通实体是在XML文档中使用的

参数实体 <!ENTITY % 实体名 "实体值">    %实体;    class.xml  class.dtd

         参数实体只能在DTD中使用

外部实体  <!ENTITY 实体名  SYSTEM "实体值所在的URL">   & ; 

外部参数实体     <!ENTITY % 实体名  SYSTEM "实体值所在的URL">   %  ;

未解析实体


XML文档的4个基本规则:

1.有且仅有一个元素

2.元素必须合理结束

3.元素之间必须合理嵌套

4.元素的属性必须有值

XML元素的基本规则:

1.合法的标签名(标签名不能以字符“xml”等开始,不能包含空格,尽量避免使用中画线(-)、点号(.)、英文冒号(:))

2.嵌套子元素。可无限深度嵌套,可以嵌套多个重名的子元素,这多个子元素之间是有序的。

3.空元素。不可接受子元素,也不可接受字符串内容。但可以接受属性(空元素和内容为空的元素并不相同)

  <book />  空元素

  <book></book>  空元素

  <book>  </book>  不是空元素,因为其内容包含一个空格

4. XML 属性必须加引号

1.       不要把注释放在标签体内,否则此文档将不是一个格式良好的文档;

2.       不要把注释放在XM声明之前,XML声明应该永远处于文档的第一行

3.       不要在注释中使用双中画线(--);

4.       XML注释不能以---> 结尾

1 XSL 转换(XSL Transformations)。

2 XSLT 使用 XPath XML 文档中进行导航。

3 描述转化过程的一种通常的说法是,XSLT XML 源树转换为 XML 结果树

 

Match="| /"

Pi配所有元素节点和根节点

Macth = "processong-instruction() | comment()"

i配所有所有处理指令和注释

如果不使用<apply-tempates>通知XSLT去处理子节点,则会按默认的模板规则来处理

 

java -jar saxon9.jar -s:book.xml -o:a.html -xsl:book.xslt

 

 

原样式单里的模板定义具有较高的优先级

不能包含任何子元素,且gref属性(import include一样)

其包含的多份XSLT中的所有模板定义具有相同的优先级,其作用只是将多个片段组合成一个完整的XSLT样式单,只有<import>元素才可以真正处理多份XSLT样式单

java -jar saxon9.jar -s:book.xml -o:out.xml -xsl:book.xslt

java -jar saxon9.jar -s:book.xml -o:html.html -xsl:html.xslt

Select="current()"

Select="."  完全等同

但在方括号里使用current()是不同的

不要试图使用firefox3IE6对其进行客户端转换,绝对大部分浏览器不支持2.0 Xalan转换器也不支持,Saxon支持2.0

1.0中,只能通过为<text><value-of>元素指定disable-output-escaping="yes"

来禁用转义

节点选取

我们将使用微软的 XML DOM 对象来载入 XML 文档,并使用 selectNodes() 函数从 XML 文档选取节点:

set xmlDoc=CreateObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("books.xml")
 
xmlDoc.selectNodes(路径表达式)

选取所有的 book 节点

下面的这个例子选取了 bookstore 元素下所有的 book 节点:

xmlDoc.selectNodes("/bookstore/book")

 

bookstore//book 选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。

../book 等同于parent::node()/child::book

//@lang 选取所有名为 lang 的属性。

 

# XQuery 字符串值可使用单引号或双引号。

# XQuery 变量 $ 并跟随一个名称来进行定义,举例,$bookstore

# XQuery 注释 (: :) 分割,举例,(: XQuery 注释 :)

 

XQuery FLWOR 表达式:

<ul>

{

for $x in doc("books.xml")/bookstore/book/title

order by $x

return <li>{$x}</li>

}

</ul>

 

Element {

  Attribute  isbn  {“1244”}

  Element title {“ddd”}

  Element author {“dd”}

}

元素类型可分为:

任意类型:ANY(不受限制)

字符串类型:#PCDATA

<!ELEMENT  元素名 (#PCDATA)>

空元素类型:EMPTY (只允许有属性,相当于没有元素体)

包含子元素:

   有序子元素:<!ELEMENT book (name , price)>  逗号

   无序子元素:没有特定语法,只能先将它们组成互斥组,然后对互斥组添加频率词(? * .)

   互斥子元素:(用 | 隔开)

   成组子元素:(绑在一起 用( )括起来)

   子元素出现的频率:与正则表达式相同的3个符号紧跟某个子元素或元素组

  DEMO

混合类型:当XML元素里既有子元素,也包含字符串。

   <!ELEMENT  (#PCDATA | .. )*>   DEMO

<!ELEMENT 作者 (#PCDATA) >

<!ATTLIST 作者 地址 CDATA #REQUIRED>

<!ATTLIST 作者 地址 CDATA #FIXED广州”>

<!ATTLIST 水果 类型 (苹果||桔子)#REQUIRED>

 

以字母开头

虽然这个是合法的,但最好用实体引用来代替

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

折腾数据折腾代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值