2

これは簡単に見つけることができるはずだと思いましたが、検索した結果、これを明確に定義するとよいかもしれません。

私の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. BarType:''
  2. BarType:'デフォルト'
  3. BarType:'チョコレート'

望ましい:

  1. BarType:'デフォルト'
  2. BarType:'デフォルト'
  3. BarType:'チョコレート'

さて、これは非常に単純なはずですよね?

4

1 に答える 1

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>
于 2009-12-08T10:00:44.107 に答える