有谁知道使用 xml 模式定义数据类型并在带有 xsl:sort 指令的 XSL 模板中使用它的示例
提前致谢。
在 XSLT 2.0 中data-type
,保留属性<xsl:sort>
只是为了与 XSLT 1.0 兼容。
排序键值使用lt
值比较运算符进行比较。这意味着不再需要提供类型“文本”或“数字”作为data-type
属性的值。如果定义排序键的表达式的类型是,xs:string
则使用lt
运算符 for xs:string
。
如果排序键的类型不是字符串或数字,而是有lt
运算符,则lt
使用此类型的运算符。例如,xs:date
、xs:dateTime
、 ... 等可以正确排序,这不需要为data-type
属性指定任何值。
用户定义的类型很可能缺少定义的lt
属性,这意味着如果排序键属于这种类型,排序操作将失败。
当然,总是可以在select
属性中提供一个表达式,该表达式是xsl:function
对用户特别提供的用于将用户定义类型的实例转换为具有lt
运算符的类型的引用。
给你一个你要求的例子,假设我们有一个模式文件 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(., ' ')"/>
</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
在这种情况下,值被排序为字符串。