1

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

提前致谢。

4

2 回答 2

0

在 XSLT 2.0 中data-type,保留属性<xsl:sort>只是为了与 XSLT 1.0 兼容。

排序键值使用lt值比较运算符进行比较。这意味着不再需要提供类型“文本”或“数字”作为data-type属性的值。如果定义排序键的表达式的类型是,xs:string则使用lt运算符 for xs:string

如果排序键的类型不是字符串或数字,而是有lt运算符,则lt使用此类型的运算符。例如,xs:datexs:dateTime、 ... 等可以正确排序,这不需要为data-type属性指定任何值。

用户定义的类型很可能缺少定义的lt属性,这意味着如果排序键属于这种类型,排序操作将失败。

当然,总是可以在select属性中提供一个表达式,该表达式是xsl:function对用户特别提供的用于将用户定义类型的实例转换为具有lt运算符的类型的引用。

于 2010-08-31T01:12:53.533 回答
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 工具(将 xsi:noNamespaceSchemaLocation 考虑在内的模式感知 XSLT 2.0 处理器)运行该样式表时

AltovaXML.exe /xslt2 test2010083101Xsl.xml /in test2010083101.xml

输出是

1.5
2
10

因此在对“数据”元素进行排序时会考虑 xs:double 数据类型。

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

1.5
10
2

在这种情况下,值被排序为字符串。

于 2010-08-31T11:27:50.667 回答