Snowberg

 

XSLT知识总结

XSLT知识总结

²       XSLT元素

一、            xsl:If:简单的条件判断元素。

1、  声明方式:

      <xsl:if

  test = boolean-Expression>

</xsl:if>

        部分属性说明:

2、  Test

一个逻辑表达式,如果为真则执行xsl:if的content所表达的操作,如果为false则不致性任何操作。

逻辑表达式可以为一个脚本判断语句,也可以为源数据中的某个节点或者属性,如果为源数据中的节点或者属性的话,则xslt执行引擎自动会把节点或者属性的值转换为Boolean值,再进行判断。

必选

3、  元素信息:

出现次数:无限制

父元素: xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素:xsl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:for-each, xsl:if, xsl:processing-instruction, xsl:text, xsl:value-of, xsl:variable, output elements

二、            xsl:for-each:对一个模板规则进行循环执行元素,也就是说对一个节点集合中的每一个节点进行循环处理。

1、  声明方式:

<xsl:for-each

  select = Expression>

</xsl:for-each>

          部分元素说明

2、  select:

一个xpath表达式,用来在当前上下文中选择一系列满足条件的源数据节点,然后对每一个节点按照content模板规则进行处理。

3、  元素信息:

出现次数:无限制

父元素:xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素:xsl:apply-imports, xsl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:number, xsl:processing-instruction, xsl:sort, xsl:text, xsl:value-of, xsl:variable

 

三、            xsl:choose ,  xsl:when ,  xsl:otherwise:多条件判断组合元素

1、  声明方式:

<xsl:choose>

  <xsl:when

      test = boolean-Expression>

</xsl:when>

<xsl:otherwise>

</xsl:otherwise>

</xsl:choose>

          部分元素说明

2、  test:

逻辑判断表达式,参考xsl:if中的test属性说明。

3、  备注:

Xsl:choose、xsl:when以及xsl:otherwise的作用类似程序设计语言中的switch、case以及default的作用。其中的xsl:when可以多次出现,而xsl:otherwise则是可以选择的,而且最多可以出现一次。

 

四、            xsl:value-of:获取选择节点的值作为文本插入到输出信息中。

1、  声明方式:

<xsl:value-of

  select = Expression

  disable-output-escaping = "yes" | "no"

</xsl:value-of>

部分元素说明:

2、  select:

一个表达式。

如果该表达式表示当前上下文中的一个节点时,则将该节点转化为一个字符串(获取该节点的值)输出。

如果该表达式表示为当前上下文中节点集合的话则将该集合中的第一个节点转化为一个字符串输出。

该表达式也可以为一个脚本语句或者一个常量,则系统自动会计算该语句的结果,并将结果转换为字符串输出。

3、  disable-output-escaping:

输出信息是否为一个转义符,默认为no, 如果为yes,则将select中的内容作为转义符进行输出,例如:<xsl:value-of disable-output-escaping="yes" select="string('&lt;')"/>则会输出一个”<”来。

4、  元素信息:

出现次数:无限制

父元素:xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素:无。

五、            xsl:template:定义一个可以重用的数据转换规则模板元素。

 

1、  声明方式:

<xsl:template

  name= Qname

  match = Pattern

  priority = number

  mode = QName

</xsl:template>

部分属性说明:

2、  name:

模板规则的名称,应该全局唯一的。如果一个模板转换规则具有名称,那么它能但是一般不需要再有”match”属性。Name属性一般于<xsl:call-template>配合使用。

3、  match:

一个xpath表达式,确定在什么情况下使用该模板转换规则。如果没有”name”属性的话,那么”match”属性是必须的。

4、  priority:

模板规则的优先级,如果具有多个相同”match”的模板的话,那么<xsl:apply-templates>则依据模板转换规则的优先级进行筛选。如果没有显式指定优先级,则处理器会为模板计算一个默认值。由处理器指定的默认优先级范围是从 -0.5 到 +0.5。基本上,模式越特殊,其默认优先级就越高。由于范围是从 -0.5 到 +0.5,因此如果显式指定一个模板的优先级为 1,就总会超过默认优先级。

5、  mode:

模板规则的模式值。一般”mode”于<xsl:apply-templates>的”mode”配合使用:如果<xsl:apply-templates>具有”mode”属性,那么它仅仅从那些具有相同
”mode”值的模版规则中进行筛选;如果<xsl:apply-templates>没有”mode”属性的,那么它也仅仅从那些没有”mode”属性的模版规则中进行筛选。

 

6、  元素信息:

元素次数:无限制

父元素: xsl:stylesheet, xsl:transform

子元素: xsl:apply-imports, xsl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:number, xsl:param, xsl:processing-instruction, xsl:text, xsl:value-of, xsl:variable, output elements

 

7、  备注:

<xsl:template>可以使用<xsl:param>子元素同<xsl:call-template>及<xsl:apply-templates>的<xsl:with-param>子元素进行类似程序设计中的参数调用操作。

六、            xsl:call-template::调用一个具有相同的”name”属性的模板转换规则的元素。

1、  声明方式:

<xsl:call-template

  name = QName>

</xsl:call-template>

2、  元素信息:

出现次数:无限制

父元素:xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素:xsl:with-param

3、  备注:

如果获得多个相同”name”属性的<xsl:template>的话则抛出一个错误。

子元素<xsl:with-param>的使用方法参考<xsl:template>的备注信息部分。

七、            xsl:apply-templates:根据每个选择节点的内容以及类型指导xslt解析器选择合适的模板转换规则<xsl:template>进行调用。

1、  声明方式:

<xsl:apply-templates

  select = Expression

  mode = QName>

</xsl:apply-templates>

部分属性说明

2、  select:

一个xpath表达式,选择合适的节点集合然后分别再调用对应的<xsl:template>对节点进行数据转换处理。

3、  mode:

具体参考<xsl:template>的”mode”属性说明。

 

4、  元素信息:

出现次数:无限制

父元素:xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素: xsl:sortxsl:with-param

5、  备注:

如果一个节点具有多个<xsl:template>的话,那么根据<xsl:tempate>的优先级(”priority”属性)确定,如果具有多个相同的优先级的<xsl:template>的话则选择最后一个<xsl:template>。

如果没有找到合适的<xsl:template>的话,那么xslt解析器自动把当前节点及其子节点的text连接起来并向目标数据进行输出,相当于调用<xsl:valueof    select =”.”/>。XSLT 定义了几个模板,它们默认生成到每个转换中(不管您是否显式提供)。这些模板被称为 XSLT 的内置模板。可能在XML 文档中处理的每种类型的节点(元素、属性、处理指令、注释等等)都有一个内置模板。然而,这些内置模板的优先级可能最低,因此当用户提供的模板也匹配相同节点时就从不会使用它们(请参见上一个关于冲突解决的问题)。只有当不存在匹配特定节点的其他模板时才使用它们。

可以采用<xsl:sort>对输出的节点集合进行排序。

子元属<xsl:with-param>的使用说明参见<xsl:template>的备注部分。

八、            xsl:param:参数元素

1、  声明方式:

<xsl:param

  name = QName

  select = Expression>

</xsl:param>

部分属性说明

2、  Name:

参数的名称,必须全局唯一,而且必选。参数的使用方式:$param-name。

3、  Select:

一个xpath表达式,从当前上下文中获取对应的节点元素,如果不存在对应的节点的话,那么param的默认值为空。如果select存在的话,那么<xsl:param〉的内容必须为空。

4、  元素信息:

出现次数:无限制

父元素: xsl:stylesheet, xsl:template, xsl:transform

子元素:xsl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:for-each, xsl:if, xsl:processing-instruction, xsl:text, xsl:value-of, xsl:variable, output elements

5、  备注:

(1)参数的使用方式:$param-name

(2)<xsl:param>的select属性与非空的内容不能够同时存在。

(3)如果<xsl:param>具有”select”属性,那么这个属性的值必须是一个表达式,而且从该表达式计算得到的值必须是一个对象,否则这个参数的值为空。

(4)<xsl:param>具有自己的作用域,作用域的范围由父元素决定。

(5)<xsl:param>可以通过xslt解析器由外部设置值,具体使用方法可以参考System.Xml.Xsl.XsltArgumentList类的使用方法。

(6)<xsl:param>可以与<xsl:with-param>搭配起来使用。

九、            xsl:with-param:向一个<xsl:template>传递一个参数值。

1、  声明方法:

<xsl:with-param

  name = QName

  select = Expression>

</xsl:with-param>

2、  属性说明参考<xsl:param>

3、  元素信息:

出现次数:无限制

父元素:xsl:apply-templates, xsl:call-template

子元素:sl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:for-each, xsl:if, xsl:processing-instruction, xsl:text, xsl:value-of, xsl:variable

十、            xsl:variable:变量元素,将一个表达式和一个变量名称绑定在一起。

1、  声明方式:

<xsl:variable

  name = QName

  select = Expression>

</xsl:variable>

2、  属性的使用方法以及作用与<xsl:param>完全一致,具体参见<xsl:param>

3、  元素信息:

出现次数:无限制

父元素: xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:for-each, xsl:if, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:stylesheet xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素: xsl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:for-each, xsl:if, xsl:processing-instruction, xsl:text, xsl:value-of, xsl:variable, output elements

4、  备注:

<xsl:param>与<xsl:variable>的使用方法以及作用都相同,但是有存在如下的区别:

(1)<xsl:param>的使用场合较少(仅仅xsl:stylesheet, xsl:template, xsl:transform),而<xsl:variable>则使用场合较多。

(2)<xsl:param>可以通过xslt解析器由外部设置其具体值,并且可以通过<xsl:with-param>在模板中修改其默认值,而<xsl:variable>则没有这种能力。

十一、    xsl:import、xsl:include:导入外部转换模板元素。

1、  声明方式:

<xsl:import  href = "uri-reference" />

<xsl:include  href = "uri-reference"/>

属性说明:

2、  href:

被导入的xslt文件位置。

3、  元素信息:

出现次数:无限制

父元素: xsl:stylesheet, xsl:transform

子元素:无

4、  备注:

              import与include必须为顶层元素,如果import与include同时存在,那么import一定要在include前声明。

              import与include的主要区别主要为:include与被导入的样式表中的模板处于完全相同的地位(具有相同的默认优先级),没有任何差别,但是import导入的模板则具有较低的默认优先级。

 

十二、    xsl:apply-imports:优从插入的样式表中调用被重载的转换规则模版元素。

1、  声明方式:

<xsl:apply-imports />

2、  元素信息:

出现次数:无限制

父元素: xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素:无

3、  备注:

Xslt解析器会优先从import的样式表查找符合条件的模版,如果import的样式表中不存在对应的模版,再从原样式表中查找符合条件的模版。

  

十三、    xsl:copy、xsl:copy-of:拷贝源节点数据插入到目标数据中元素。

1、  声明方式:

<xsl:copy  use-attribute-sets = QNames >

</xsl:copy>

<xsl:copy-of  select = Expression/>

 

部分属性说明:

2、  use-attribute-sets:

一个属性集合名称,或者一个空格分隔的多个属性名称。

3、  select:

一个xpath表达式,用来获取xsl:copy-of用来拷贝到目标数据中的部分。如果结算的结果为节点集合,那么copy-of会将这些节点及其该节点的所有属性以及子节点按照原顺序全部拷贝到目标数据中;如果计算结果为一个值,则将该值写入目标数据中。如果为非法的xpath表达式,则不作任何操作。

4、  元素信息:

xsl:copy:

出现次数:无限制

父元素:xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素:xsl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:for-each, xsl:if, xsl:processing-instruction, xsl:text, xsl:value-of, xsl:variable, output elements

 

xsl:copy-of:

出现次数:无限制

父元素:xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素:无

5、  备注:

(1)、xsl:copy:将在目标数据中创建一个与当前节点相同名称、数据类型、命名空间的节点,但是当前节点的文本信息、子节点、属性并不会自动拷贝到目标数据节点中去。

 (2)、xsl:copy-of:当其“select”属性结算结果为一个源数据中的一个节点或者节点集合的时候,它会将该节点或者节点集合及其属性以及子节点按照相同的顺序安全拷贝到目标数据中去。这也是xsl:copy-of与xsl:copy的主要区别,另外如果计算的结果为一个值得时候,它会把这个值输出到目标数据中去。

 

十四、    xsl:sort:结点集合排序元素。

1、  声明方式:

<xsl:sort

  select = string-Expression

  lang = { nmtoken }

  data-type = { "text" | "number" | QName }

  order = { "ascending" | "descending" }

  case-order = { "upper-first" | "lower-first" }

/>

属性说明:

2、  select:

一个xpath表达式,为节点选择排序使用的键(节点本身、子节点、属性或者其它相关节点),如果结算结果不为节点,则xsl:sort不起任何作用。

3、  lang:

排序使用的语言,不同的语言有不同的排序比较算法。

4、  data-type:

排序使用键对应节点的数据类型。

5、  order:

升序或者降序

6、  case-order:

字符串大小写处理方法。

 

7、  元素信息:

元素次数:无限制

父元素:xsl:apply-templates, xsl:for-each

子元素:无。

8、  备注:

排序算法将忽略dash(‘-‘)。

十五、    xsl:element:创建一个特殊名称的输出元素。

1、  声明方式:

<xsl:element

  name = "element-name" 

  namespace = "uri-reference"

  use-attribute-sets = QNames>

</xsl:element>

属性说明:

2、  name:

新建输出元素的名称,是一个QName。必选

3、  namespace:

新建的输出元素的命名空间URI。如果name中的prefix(前缀)不为空,那么这个特殊的前缀将于命名空间Uri绑定在一起。

4、  use-attribute-sets:

属性集合名称,为新建输出元素设置属性集合,如果有多个属性集合名称则使用空格分开。

 

5、  元素信息:

元素次数:无限制

父元素:xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素:xsl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:for-each, xsl:if, xsl:processing-instruction, xsl:text, xsl:value-of, xsl:variable, output elements

十六、    xsl:attribute-set:属性集合元素。

1、  声明方式:

<xsl:attribute-set

  name = QName

  use-attribute-sets = QNames >

</xsl:attribute-set>

属性说明:

2、  name:

属性集合名称,共use-attribute-sets及xsl:use-attribute-sets使用。

3、  use-attribute-sets:

另外一个存在的属性集合名称,如果use-attribute-set存在,那么当前属性集合中不仅仅包括子元素(xsl:attribute)声明的属性,而且也包括use-attribute-sets中包括的所有子属性。

 

4、  元素信息:

元素次数:无限制

父元素:xsl:stylesheet, xsl:transform

子元素:xsl:attribute

5、  备注:

(1)如果use-attributes-set不为空,那么有可能造成循环引用的可能,或者在输出元素中存在多个相同名称的属性,因此避免在xsl:attribute-set中使用“use-attribute-sets”属性,而是用xsl:attribute在子元素中进行替换。

(2)可以使用use-attribute-sets属性以及xsl:use-attribute-sets(在文本输出元素中使用)对xsl:attribute-set进行使用。

(3)在文本输出元素中,可以使用三种方式添加输出元素的属性,他们添加的顺序分别为:

   a、使用xsl:use-attribute-sets属性添加的输出元素属性

   b、输出元素自身直接具有的属性,如:<test id=”999” xsl:use-attribute-sets=”ddd”/>中的id属性。

   c、使用<xsl:attribute>元素申明的属性。

如果在这三种添加方式中存在相同名称的属性,那么后添加的属性将会覆盖相同名称属性的值。

   在<xsl:element>中增加输出元素属性的方法具有a、c两种,它们的优先级也同文本输出元素,也具有相同的覆盖原则。

(4)如果存在多个相同名称的xsl:attribute-set,那么这多个属性集合将会合并为,但是如果多个相同名称的xsl:attribute-set中存在相同名称的属性声明,这会导致一个错误出现。

 

十七、    xsl:attribute:为当前输出元素创建一个特殊名称的输出属性。

1、  声明方式:

<xsl:attribute

  name = "attribute-name" 

  namespace = "uri-reference">

</xsl:attribute>

2、  属性说明参考<xsl:element>中的”name”属性以及”namespace”属性说明。

3、  元素信息:

元素次数:无限制

父元素:xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:template, xsl:variable, xsl:when, xsl:with-param, output-element.

子元素: xsl:apply-imports, xsl:apply-templates, xsl:call-template, xsl:choose, xsl:copy, xsl:copy-of, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:number, xsl:text, xsl:value-of, xsl:variable

十八、    xsl:comment:在输出数据中产生一个注释<!--content-->信息。

1、  声明方式:

<xsl:comment>

</xsl:comment>

2、  元素信息:

元素次数:无限制

父元素:xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素:xsl:apply-imports, xsl:apply-templates, xsl:call-template, xsl:choose, xsl:copy, xsl:copy-of, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:number, xsl:text, xsl:value-of, xsl:variable

十九、    xsl:text:向输出数据中插入一个文本节点,即使其内容全部为空格也会保存在输出数据中。

1、  声明方式:

<xsl:text

  disable-output-escaping = "yes" | "no">

</xsl:text>

2、  disable-output-escaping:

   参考xsl:value-of的disable-output-escaping属性说明。

3、  元素信息:

元素次数:无限制

父元素:xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:otherwise, xsl:message, xsl:param, xsl:processing-instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素:无(可以在其中包含具体的文本信息,但是文本不能出现输出元素信息声明)

 

二十、    xsl:processing-instruction:在输出数据中产生一个处理指令节点元素。

1、  声明方式:

<xsl:processing-instruction

  name = "pi-name">

</xsl: processing-instruction>

2、  name:

处理指令节点名称。

3、  元素信息:

元素次数:无限制

父元素:xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素:xsl:apply-imports, xsl:apply-templates, xsl:call-template, xsl:choose, xsl:copy, xsl:copy-of, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:number, xsl:text, xsl:value-of, xsl:variable

4、  备注:

(1)处理指令节点的名称为”name”属性指定,xsl:processing-instruction的具体内容填充处理指令的其它部分。

(2)xml声明符不属于处理指令节点,应该使用xsl:output来产生。

二十一、          xsl: message:产生一个输出信息(字符串或者对话框),引发一个系统级错误信息,具体依赖于编译环境。

1、  声明方式:

<xsl:message

  terminate = "yes" | "no" >

</xsl:message>

2、  terminate:

是否终止xslt解析器的转换执行,如果为”yes”,那么xslt解析器将终止转换执行,并产生一个系统级的错误信息;如果为”no”,那么xslt解析器将忽略错误,并继续执行数据转换操作。

3、  元素信息:

元素次数:无限制

父元素:xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素:xsl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:for-each, xsl:if, xsl:processing-instruction, xsl:text, xsl:value-of, xsl:variable, output elements

4、  备注:

xsl:message在xml转换过程提供了一种调试的方法。

 

二十二、          xsl:number:在输出数据中插入一个格式化的数字。

1、  声明方式:

<xsl:number

  level = "single" | "multiple" | "any"

  count = Pattern

  from = Pattern

  value = number-Expression

  format = { string }

  lang = { nmtoken }

  letter-value = { "alphabetic" | "traditional" }

  grouping-separator = { char }

grouping-size = { number } />

2、  属性说明:略

3、  元素信息:

元素次数:无限制

父元素:xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素:无

二十三、          xsl:decimal-format:声明一种数字格式化方法的元素,供format-number函数使用。

1、  声明方式:

<xsl:decimal-format

  name = QName

  decimal-separator = char

  grouping-separator = char

  infinity = string

  minus-sign = char

  NaN = string

  percent = char

  per-mille = char

  zero-digit = char

  digit = char

pattern-separator = char />

2、  属性说明略。

3、  元素信息:

元素次数:无限制

父元素:xsl:stylesheet, xsl:transform

子元素:无

4、  备注:

(1)xsl:decimal-format提供了数字格式化方式,供format-number使用。

(2)xsl:decimal-format的”name”不是必选的,如果没有则表示为默认的数字格式化方式,如果有则可以被format-number函数显示的使用,但是不能够同时存在两个相同名称(或者两个默认没有名称)的xsl:decimal-format定义。

二十四、          xsl:fallback:设置为当xslt解析器遇到不能识别或者不能够处理的xsl元素的时候的缺省处理方式。

1、  声明方式

<xsl:fallback>

</xsl:fallback>

2、  元素信息:

元素次数:无限制

父元素:xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements

子元素:xsl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:for-each, xsl:if, xsl:processing-instruction, xsl:text, xsl:value-of, xsl:variable, output elements

3、  备注:

(1)当一个xslt文档被加载后,解析器会首先检验出现的所有xslt元素,当xsl:stylesheet中标示的版本比当前版本高的时候,解析器对所有不能够识别的xslt元素执行其中的xsl:fallback部分操作(xsl:fallback为空或者不存在则不执行任何操作),如果xsl:stylesheet中标示的版本小于或者等于当前解析器版本的时候,则遇到不能够识别的xslt元素会产生一个错误。

(2)xsl:fallback是向后兼容机制(forward-processing)的一部分实现方式,主要为了处理不同版本的xslt解析器的差异。

(3)xsl:fallback不仅仅对版本不兼容起作用,另外也处理那些命名空间扩展而定义的一些元素。因为增加一个功能到xslt规范中去是比较困难的一件事情,因此开发人员可以开发一些功能通过实现对应的命名空间(具体操作参考后面的知识总结或者System.Xml.Xsl.XslArgumentList类的使用方法),当解析器遇到没有实现的扩展功能的时候便会执行对应的xsl:fallback操作。

二十五、          xsl:namespace-alias:命名空间替换元素。

1、  声明方式:

<xsl:namespace-alias

  stylesheet-prefix = NCName

result-prefix = NCName/>

属性说明:

2、  stylesheet-prefix:

在样式表中使用的命名空间前缀。

3、  result-prefix:

在目标数据中使用的前缀。

4、  元素信息:

元素次数:无限制

父元素:xsl:stylesheet

子元素:无

5、  备注:

xsl:namespace-alias主要为了避免目标命名空间与样式表命名空间冲突而设置的,主要是用在xsl产生xsl的情况中。

因为xsl:namespace-alias是顶层元素,所以所有的stylesheet-prefix与result-prefix相关的命名空间必须在xsl:stylesheet中预先声明好。这样在输出数据中所有的stylesheet-prefix相关的命名空间都会替换为result-prefix关联的命名空间。

二十六、          xsl:preserve-space、xsl:strip-space全部为空格的文本节点处理方式元素。

1、  声明方式:

<xsl:preserve-space

elements = tokens />

<xsl:strip-space

  elements = tokens />

属性说明:

2、  elements:

元素名称列表,对这些元素,如果其文本节点内容全部为空格的话,那么如果为xsl:preserve-space则保留这些空格,如果未xsl:trip-space则忽略这些空格。

3、元素信息:

元素次数:无限制

父元素:xsl:stylesheet, xsl:transform

子元素:无

二十七、          xsl:stylesheet、xsl:transform:样式表声明元素。

1、  声明方式:

<xsl:stylesheet

  id = id

  extension-element-prefixes = NCNames

  exclude-result-prefixes = NCNames

  version = number>

</xsl:stylesheet>

<xsl:transform

  id = id

  extension-element-prefixes = tokens

  exclude-result-prefixes = tokens

  version = number>

  <!-- Content: (xsl:import*, top-level-elements) -->

</xsl:transform>]

部分属性说明:

2、  version:

样式表的版本号,必选。

3、  extended-element-prefixes:

扩展元素命名空间前缀集合,命名空间前缀之间是用空格隔开。与这些前缀相关的命名空间Uri被认为是扩展命名空间,被用作扩展功能使用。

4、  exclude-result-prefixes:

所有不输出到结果数据中的命名空间前缀集合。如果命名空间前缀没有这这里出现,那么命名空间将输出到结果数据中去。

 

5、  元素信息:

元素次数:1次

父元素:无

子元素:xsl:attribute-set, xsl:import, xsl:include, xsl:output, xsl:param, xsl:template, xsl:variable, msxsl:script

6、  备注:

xsl:stylesheet与xsl:transform的作用完全相同,都为样式表的声明元素。

二十八、          msxsl:script:扩展函数声明元素。

1、  声明方式:

<msxsl:script

  language = "language-name"

  implements-prefix = "prefix of user's namespace">

</msxsl:script>

2、  language:

在该扩展函数中使用的脚本语言名称,可以使用该脚本语言在msxsl:script中定义方法或者变量供样式表是用。

3、  implements-prefix:

与之相关联的扩展命名空间前缀(这样就可以通过扩展命名空间前缀(prefix)以及在msxsl中定义的方法或者变量名称进行使用扩展函数的功能,如:prefix:functionName())。

4、  元素信息:

元素次数:无限制

父元素:xsl:stylesheet, xsl:transform

子元素:无

5、  备注:

(1)Xslt1.0有两种标准的扩展实现方式:元素扩展以及函数扩展。

(2)元素扩展是指在样式表中定义具有特殊含义的元素,并在样式表中使用,如果要定义扩展元素,那么必须在xsl:stylesheet中声明与该元素相关的扩展命名空间,并在extended-element-prefixes属性中设置该扩展命名空间的前缀(函数扩展就没有必要在extended-element-prefixes中设置该扩展命名空间的前缀)。

(3)函数扩展式是指在样式表中定义具有特殊功能的函数或者变量供样式表使用,提供这种扩展有两种方式:直接在xslt中使用msxsl:script元素添加脚本代码来实现函数扩展(也称为扩展脚本),或者在.net中使用System.Xml.Xsl.XslArgumentList指定(在其它非托管代码中使用IXSLProcessor.AddObject方法实现)外部托管组件(Com组件)来实现函数扩展(也称为扩展对象),但是这两种实现方式都需要在xsl:stylesheet中声明对应的扩展命名空间。

(4)要使用msxsl:script必须在xsl:stylesheet中声明xmlns:msxsl = “urn:schemas-microsoft-com:xslt”命名空间。

二十九、          xsl:output:输出数据属性设置元素。

1、  声明方法:

<xsl:output

method = "xml" | "html" | "text" | QName

version = nmtoken

encoding = string

omit-xml-declaration = "yes" | "no"

standalone = "yes" | "no"

doctype-public = string

doctype-system = string

cdata-section-elements = QNames

indent = "yes" | "no"

media-type = string

/>

三十、    xsl:key:声明一个指定的键。

1、  声明方式:

<xsl:key

  name = QName

  match = Pattern

use = Expression />

属性说明:

2、  name:

键的名称,供key函数使用,必选。

3、  match:

模式表达式,来标示xsl:key要应用的节点

4、  use:

xpath表达式,通过它可以计算出键的真实值。

 

5、  元素信息:

元素次数:无限制

父元素:xsl:stylesheet 

子元素:无

6、  备注:

xsl:key与key函数搭配使用可以用来筛选指定键值的节点,使用如下所示:

输入xml数据:

<?xml version='1.0'?>

<?xml-stylesheet type="text/xsl" href="key_sample.xsl" ?>

<titles>

   <book title="XML Today" author="David Perry"/>

   <book title="XML and Microsoft" author="David Perry"/>

   <book title="XML Productivity" author="Jim Kim"/>

</titles>

样式表:key_sample.xsl

<?xml version='1.0'?>

<xsl:stylesheet version="1.0"

      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:key name="title-search" match="book" use="@author"/>

<xsl:template match="/">

   <HTML>

      <BODY>

        <xsl:for-each select="key('title-search', 'David Perry')">

         <div>

         <xsl:value-of select="@title"/>

         </div>

      </xsl:for-each>

      </BODY>

   </HTML>

</xsl:template>

</xsl:stylesheet>

输出数据:

<HTML>

<BODY>

<div>XML Today</div>

<div>XML and Microsoft</div>

</BODY>

</HTML>

 

²       XSLT扩展开发

XSLT1.0标准定义两种扩展方式:扩展元素及扩展函数。

 

扩展元素:即当开发人员在认为XSLT1.0标准定义的元素功能不够或者不满足需求的时候,可以自定义一个元素,该元素由一段外部代码处理,供XSLT解析器在数据转换的时候使用。在.net中XstlTransform不能够自定义扩展元素,因此在这里就不再讨论。

 

扩展函数:在样式表中可以使用XSLT函数以及XPath函数,但是这些函数的功能是有限的,为了满足特殊的使用场合,开发人员可以自己定义函数或者变量在样式表中使用,这就是所谓的扩展函数。XSTL1.0标准没有定义如何实现这些功能的详细信息,所以可能不同的XSLT解析器有不同的实现方式,但在.Net中扩展函数有两种实习方式:直接在样式表中使用msxsl:script元素嵌入脚本,或者使用已经存在.net装配件或者Com组件,我们分别把它们简称为脚本扩展实现方式以及组件扩展实现方式,在下面就分别详细的讨论他们的实现方式:

一、            脚本扩展开发方式

1、  定义相关的命名空间。

在xsl:stylesheet中声明与扩展函数相关的命名空间:xmlns:msxsl=” urn:schemas-microsoft-com:xslt”及自定义扩展命名空间,在这里为xmlns:userCSharp=”urn:myExtendedFunction:xslt”,以后在样式表中就可以使用userCSharp作为前缀使用扩展函数(userCSharp:functionName(param))。

 

如下所示:

<?xml version=”1.0”?>

<xsl:stylesheet version=”1.0”

             xmlns:xsl=”http://www.w3.org/1999/XSL/Transform

             xmlns:msxsl=” urn:schemas-microsoft-com:xslt”

             xmlns: userCSharp =” urn:myExtendedFunction:xslt”>

</xsl:stylesheet>

    

2、  输入脚本。

使用msxsl:script在样式表输入脚本,msxsl:script的具体使用格式可以参考《msxsl:script元素》说明信息,注意这里要设置脚本的具体语言(language属性),在.net中可以为c#、vb 、Jscript等;以及实现的扩展命名空间前缀(implements-prefix属性)。

 

如下所示:

<msxsl:script language=”c#” implements-prefix=”userCSharp”>

<![CDATA[

public string GetName( )

{

return "wangzhenqian";

}

]]>

</msxsl:script>

在这里定义了一个函数:GetName,它仅仅返回一个字符串。

 

3、  使用扩展函数。

定义了扩展函数后,在XSLT中就可以像使用XSLT函数一样的使用它们,但是唯一不同的是使用时候它们前缀一定为自定义扩展命名空间前缀。

 

如下所示:

<xsl:variable name="var:v2" select="userCSharp:GetName()" />

 

4、  总结:

上面三步显示了内嵌脚本来实现扩展函数的实现步骤,相对来说比较简单。另外注意如下几点:

(1)可以在msxsl:script中定义多个函数,也可以在其中定义变量,这个变量具有全局(当前语言范围内)作用域。

(2)同一种语言可以在多个msxsl:script中使用,但是必须注意这多个代码块中不能够有相同名称相同作用域的变量,或者相同参数相同名称函数,其实所有这些代码块都会合并为一个类的,所以出现上述现象会导致异常。

 

二、            外部组件扩展开发方式

外部组件扩展开发方式主要使用已经编译好的.net装配件或者Com组件来实现这个扩展函数的功能,而不是使用内嵌脚本的方式实现。它的操作步骤具体如下所示:

1、  定义相关的命名空间。(具体参考《一、脚本扩展开发方式》中实现步骤1)

2、  开发DLL组件或者Com组件,在这些DLL中实现对应的扩展对象,扩展对象中包含需要使用的函数或者变量。

3、  在转换前将扩展对象加入解析器的上下文中。

如下所示:

Com组件调用情况:

var xslt = new ActiveXObject("Msxml2.XSLTemplate.4.0"); 

xslt.stylesheet = xslDoc;

xslProc = xslt.createProcessor();

xslProc.AddObject( extendedObject , extendedNamespaceUri );

 

(2).Net调用情况

XslTransform xslt = new XslTransform();

xslt.Load(stylesheet);

XsltArgumentList xslArg = new XsltArgumentList();

//添加扩展对象

ExtendedObjectClass extendedObject = new ExtendedObjectClass();

xslArg.AddExtensionObject( extendedNamespaceUri , extendedObject);

xslt.Transform(doc, xslArg, Console.Out);

注意在上面的代码中 extendedObject是指扩展对象实例,而extendedNamespaceUri是指在步骤1中定义的扩展命名空间Uri,这样就将扩展命名空间与扩展对象关联起来了,它的作用等同于msxsl:script.

4、  使用扩展函数(具体参考《一、脚本扩展开发方式》中实现步骤3)。

三、            两种方式优缺点总结

1、  移植性:

嵌入式脚本比扩展对象更容易移植,因为任何.Net平台都可以正确地用嵌入式脚本来转换一个样式表。而另一方面,使用扩展对象的样式表则只能用一段代码来进行转换,而且需在.Net平台或其他一些支持扩展对象的平台下进行,并要求这段代码能正确地实现一个带有效的名称和命名空间URI的扩展对象。

2、  大小:

一个依赖于扩展对象的样式表比包含嵌入式脚本的样式表要小,而且更容易维护。

3、  灵活性:

正如我们看到的那样,依赖于扩展对象的样式表可以按照修改约束它们的扩展对象的功能来修改它们的行为。而使用嵌入式脚本的样式表则永远只能按照嵌入的脚本语言指定的功能执行操作。

4、  性能:

因为扩展对象是预编译的,而不是即时编译的,因此使用扩展对象的脚本的性能在某种程度上要比嵌入式脚本高一些。不过具体情况下还要考虑装入样式表的频率以及嵌入式脚本的规模等因素。

5、  可维护性:

使用扩展对象的样式表在修改和纠错时可能比较困难,因为真正的代码从样式表和提供扩展对象实现的代码中分离出去了。而嵌入式脚本尽管稍微慢一些,却具有将所有代码都置于本地的优点。

 

通过考虑上述一些因素,我们可以决定在具体的情况下是使用扩展对象还是使用嵌入式脚本了。

四、            其它注意事项

1、  msxsl:node-set(string):将字符串转化为节点数组集合。

2、  XPath节点集和结果树片段分别映射到实现XPathNavigator 和 XPathNodeIterator的.NET对象,及DOM NodeList 接口 (IXMLDOMNodeList) 的 JScript 和 VBScript 对象,IXMLDOMNodeList 在本质上只是一般 DOM 节点的集合接口,它支持基本的遍历和长度查询。

来之:http://blog.csdn.net/wzq981264/article/details/380645

posted on 2011-09-08 11:24  Snowberg  阅读(732)  评论(0编辑  收藏  举报

导航