关于使用XSL 2.0和数据类型扩展<xsl:sort>的<xsl:sort>的问题</xsl:sort>

时间:2010-08-30 23:20:04

标签: xslt xslt-2.0

有没有人知道使用xml架构定义数据类型并在带有xsl:sort指令的XSL模板中使用它的示例

提前致谢。

2 个答案:

答案 0 :(得分:0)

在XSLT 2.0中,data-type的{​​{1}}属性仅用于与XSLT 1.0兼容。

使用<xsl:sort>值比较运算符比较排序键值。这意味着不再需要提供“text”或“number”类型作为lt属性的值。如果定义排序键的表达式类型为data-type,则使用xs:string的{​​{1}}运算符。

如果排序键的类型不是字符串或数字,但具有lt运算符,则使用此类型的xs:string运算符。例如,ltlt,...等可以正确排序,这不需要为xs:date属性指定任何值。

用户定义的类型可能缺少已定义的xs:dateTime属性,这意味着如果排序键属于此类型,则排序操作将失败。

当然,人们总是可以在data-type属性中提供一个表达式,该表达式是用户特别提供的用于将用户定义类型的实例转换为类型的lt的引用它有select运算符。

答案 1 :(得分:0)

为了给你一个你要求的例子,假设我们有一个模式文件test2010083101Xsd.xml,如下所示:

<xs:schema
  xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="root">
    <xs:complexType>
      <xs:sequence maxOccurs="unbounded">
        <xs:element name="data" type="xs:double"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

XML输入文档如下:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test2010083101Xsd.xml">
  <data>2</data>
  <data>10</data>
  <data>1.5</data>
</root>

和XSLT 2.0样式表如下:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:apply-templates select="root/data">
      <xsl:sort select="."/>
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="data">
    <xsl:value-of select="concat(., '&#10;')"/>
  </xsl:template>

</xsl:stylesheet>

然后当您使用AltovaXML工具(一个模式识别的XSLT 2.0处理器,将xsi:noNamespaceSchemaLocation考虑在内)与

一起运行该样式表
AltovaXML.exe /xslt2 test2010083101Xsl.xml /in test2010083101.xml

输出

1.5
2
10

因此在排序'data'元素时会考虑xs:double数据类型。

当您使用不支持模式的XSLT 2.0处理器(如Saxon 9.2 Home Edition)对相同的XML输入文档运行相同的样式表时,输出是不同的:

1.5
10
2

就像那种情况一样,值被排序为字符串。