Отображение заданного XSD значения атрибута по умолчанию с использованием XSL

Я думал, что это должно быть просто найти, но после некоторых поисков я обнаружил, что было бы неплохо четко определить это.

В моем XSD я определил перечисление, полученное из строки. В сложном типе я определил и атрибут, который ссылается на это перечисление, со значением по умолчанию.

В моем XSL я хочу отображать значение этого атрибута по умолчанию для элементов, атрибут которых не задан явно.

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>

XML:

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

Я ожидаю, что XSL будет: (более или менее)

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

Теперь, когда я отображаю этот XML-файл стиля, значение атрибута «bar» пусто для неуказанного значения, в то время как я хотел бы отобразить (или выбрать) значение по умолчанию.

В настоящее время:

  1. БарТип: ''
  2. БарТип: «по умолчанию»
  3. BarType: 'шоколад'

Желанный:

  1. БарТип: «по умолчанию»
  2. БарТип: «по умолчанию»
  3. BarType: 'шоколад'

Теперь это должно быть довольно просто, не так ли?


person Robert Sirre    schedule 08.12.2009    source источник


Ответы (1)


Возможно, я слишком обобщаю, но если вы хотите загрузить значение по умолчанию из схемы, вам понадобится что-то вроде этого:

<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>
person Tomalak    schedule 08.12.2009
comment
Спасибо за ответ. Похоже, довольно много «работы» для значения, которое так легко определяется на уровне XSD. Я понимаю, почему не отображаемое значение не отображается, но я действительно ожидаю более простого способа вернуться к значению по умолчанию. (что-то вроде xsl:value-of-or-default) Как вы могли догадаться, я новичок в XSL, я едва касался поверхности. - person Robert Sirre; 08.12.2009
comment
XSLT не так интегрирован с XML-схемой, как вы могли бы подумать. Это язык преобразования XML, он может рассматривать схему как еще один XML-документ. Это то, что я сделал здесь. XSLT не заботится о том, соответствует ли ваш XML схеме или нет, все, что ему нужно, это корректность. xsl:value-of-or-default нет. - person Tomalak; 08.12.2009
comment
Я понимаю предложенный вами метод. Я просто предположил, что, поскольку XSL «нашел» значение атрибута с помощью выбора XPath, и для этого требуется правильное сопоставление пространства имен, он будет лучше осведомлен об определениях и ограничениях, налагаемых XSD. Вы в целом согласны со мной, что это не странный вопрос? - person Robert Sirre; 08.12.2009
comment
Если это поможет. ;-) XSLT просто не разрабатывался как помощник проверки XML с поддержкой схемы. Возможно, в XSLT 2.0 есть дополнительная поддержка для этого (я не очень хорошо знаю 2.0), но в версии 1.0 вышеописанное близко к тому, что получается. Я мог бы придумать способ еще больше обобщить выборку значения по умолчанию, но он всегда будет оставаться на этом уровне. - person Tomalak; 08.12.2009