Учитывая элемент <xs: union>, как определить его тип с помощью XSLT? - PullRequest
1 голос
/ 11 октября 2011

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

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

Примером фрагмента XML будет:

<value>42</value>

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

Ответы [ 2 ]

1 голос
/ 12 октября 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>
1 голос
/ 11 октября 2011

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

Если с XML-документом не связана схема, ответом будет то, что типом всегда является xs:string, и вопрос не слишком значимый.

Однако правильный вопрос: : С каким из этих типов это совместимо (как castable)?

Это преобразование показывает, как это можно узнать. Это также иллюстрирует элегантность и мощь <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. 
...