Имея элемент ‹xs:union›, как определить его тип с помощью XSLT?

У меня есть XML-схема, содержащая следующий элемент типа:

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

Пример фрагмента XML:

<value>42</value>

Как в преобразовании XSLT определить, какой тип имеет значение, т. е. является ли оно логическим, целым, двойным или строковым?


person Abelson    schedule 11.10.2011    source источник


Ответы (2)


Как в преобразовании 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. 
person Dimitre Novatchev    schedule 11.10.2011

Если вы используете преобразование с поддержкой схемы, то этот элемент значения будет иметь тип xs:int — первый из типов членов объединения, для которых допустим экземпляр.

Если вы хотите проверить, какой это тип, попробуйте что-то вроде этого:

<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>
person Michael Kay    schedule 12.10.2011