给定<xs:union>元素,如何使用XSLT确定其类型?</xs:union>

时间:2011-10-11 12:11:59

标签: xml xsd xslt-2.0

我有一个包含以下类型元素的XML Schema:

<xs:simpleType name="value">
  <xs:union memberTypes="xs:boolean xs:int xs:double xs:string"/>
</xs:simpleType>

示例XML片段将是:

<value>42</value>

在XSLT转换中,如何确定值的类型,即布尔值,整数,双精度或字符串?

2 个答案:

答案 0 :(得分:1)

  

在XSLT转换中,如何确定值的类型,   即,它是布尔值,整数,双精度或字符串吗?

如果没有与XML文档关联的模式,答案是该类型始终为xs:string,并且问题不太有意义。

但是,正确的问题是:这些类型中的哪一种兼容(可投射)?

此转换显示了如何找到它。它还说明了<xsl:next-match>

的优雅和力量
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="text()[. castable as xs:integer]">
     <xsl:sequence select="., ' is castable as xs:integer. '"/>
     <xsl:next-match/>
 </xsl:template>

 <xsl:template match="text()[. castable as xs:boolean]">
     <xsl:sequence select="., ' is castable as xs:boolean. '"/>
     <xsl:next-match/>
 </xsl:template>

 <xsl:template match="text()[. castable as xs:string]">
     <xsl:sequence select="., ' is castable as xs:string. '"/>
     <xsl:next-match/>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

应用于提供的XML文档

<value>42</value>

产生了想要的正确结果

42 is castable as xs:string. 42 is castable as xs:integer. 

答案 1 :(得分:1)

如果您正在使用模式感知转换,则此值元素的类型为xs:int - 实例有效的union的第一个成员类型。

如果您想测试它是哪种类型,请尝试以下方法:

<xsl:choose>
  <xsl:when test=". instance of element(*, xs:int)">int</xsl:when>
  <xsl:when test=". instance of element(*, xs:boolean)">boolean</xsl:when>
  etc
<xsl:choose>