2009-12-08 5 views
2

Je pensais que cela devrait être simple à trouver, mais après quelques recherches, j'ai trouvé que cela pourrait être agréable à définir clairement.Afficher la valeur par défaut définie par XSD de l'attribut en utilisant XSL

Dans mon XSD j'ai défini une énumération, dérivée d'une chaîne. Dans un type complexe j'ai défini et attribut qui se rapporte à cette énumération, avec une valeur par défaut.

Dans mon XSL je souhaite afficher la valeur par défaut de cet attribut pour les éléments dont l'attribut n'est pas explicitement défini.

Le XSD:

<xs:complexType name="foo"> 
    <xs:attribute name="bar" type="responsecodes:barType" default="default"/> 
</xs:complexType> 

<xs:simpleType name="barType"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="default"> 
      <xs:annotation> 
       <xs:documentation xml:lang="en-us">Default bar.</xs:documentation> 
      </xs:annotation> 
     </xs:enumeration> 
     <xs:enumeration value="chocolate"> 
      <xs:annotation> 
       <xs:documentation xml:lang="en-us">A chocolate ...bar</xs:documentation> 
      </xs:annotation> 
     </xs:enumeration> 
    </xs:restriction> 
</xs:simpleType> 

Le XML:

.... 
<foo/> 
<foo bar="default"/> 
<foo bar="chocolate"/> 
.... 

J'attends le XSL soit: (plus ou moins)

<ol> 
<xsl:for-each select="/foo"> 
    <li>BarType: '<xsl:value-of select="@bar" />'</li> 
</xsl:for-each> 
</ol> 

Maintenant, quand j'afficher ce fichier XML de style, la valeur de l'attribut 'barre' est vide pour la valeur non spécifiée, alors que je souhaiterais afficher (ou sélectionner) la valeur par défaut.

maintenant:

  1. Bartype: ''
  2. Bartype: 'default'
  3. Bartype: 'chocolat'

désiré:

  1. Bartype: « défaut '
  2. Bartype: 'default'
  3. Bartype: 'chocolat'

Maintenant, cela devrait être assez simple, non?

Répondre

1

Peut-être que je suis trop généraliser, mais si vous voulez charger la valeur par défaut à partir du schéma, vous auriez besoin de quelque chose le long des lignes de celle-ci:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
> 

    <xsl:variable name="schema" select=" 
    document('responsecodes.xsd') 
    " /> 
    <xsl:variable name="DefaultBar" select=" 
    $schema//xs:complexType[@name='foo']/xs:attribute[@name='bar']/@default 
    " /> 

    <xsl:template match="foo"> 
    <li> 
     <xsl:text>BarType: '</xsl:text> 
     <xsl:choose> 
     <xsl:when test="@bar"> 
      <xsl:value-of select="@bar" /> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$DefaultBar" /> 
     </xsl:otherwise> 
     </xsl:choose> 
     <xsl:text>'</xsl:text> 
    </li> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Merci pour la réponse. Cela ressemble à un peu de «travail» pour une valeur qui est si facilement définie au niveau XSD. Je comprends la raison d'une non-valeur à ne pas afficher, mais je m'attendrais vraiment à un moyen plus facile de revenir à la valeur par défaut. (Quelque chose comme xsl: value-of-or-default) Comme vous l'avez peut-être deviné, je suis assez nouveau sur XSL, j'ai à peine effleuré la surface. –

+0

XSLT n'est pas aussi intégré à XML Schema que vous pourriez le penser. C'est un langage de transformation XML, il peut regarder Schema comme un autre document XML. C'est ce que j'ai fait ici. XSLT ne se soucie pas de savoir si votre XML est valide par rapport à un schéma ou non, tout ce dont il a besoin est bien formé. Il n'y a pas de 'xsl: value-of-or-default'. – Tomalak

+0

Je comprends la méthode que vous avez fournie. J'ai juste deviné que comme le XSL 'trouvé' la valeur de l'attribut via la sélection XPath, et cela nécessite le mappage d'espace de noms correct, il serait plus conscient des définitions et des restrictions imposées par le XSD. Êtes-vous en général d'accord avec moi que ce n'est pas une question étrange à poser? –

Questions connexes