使用 XSLT 显示来自 XSD 的选项和来自 XML 的默认值

Use XSLT to display options from XSD and default values from XML

如果我的 xml 说

<book>
   <chapter1>b</chapter1>
   <chapter3>h</chapter3>
</book>

我的xsd说

<xs:schema>

  <xs:element name="chapter1">
    <xs:simpleType>
      <xs:restriction base="xs:string">                                                                                                             
      <xs:enumeration value="a"/>                                                                                                               
      <xs:enumeration value="b"/>  
  </xs:restriction>                                                                                                                             
  </xs:simpleType>                                                                                                                                                                                                                               
</xs:element>

  <xs:element name="chapter2">
    <xs:simpleType>
      <xs:restriction base="xs:string">                                                                                                             
      <xs:enumeration value="d"/>                                                                                                               
      <xs:enumeration value="e"/>  
    </xs:restriction>                                                                                                                             
  </xs:simpleType>                                                                                                                                                                                                                               
 </xs:element>

  <xs:element name="chapter3">
    <xs:simpleType>
      <xs:restriction base="xs:string">                                                                                                             
    </xs:restriction>                                                                                                                             
  </xs:simpleType>                                                                                                                                                                                                                               
 </xs:element>

</xs:schema>

我应该申请什么样的xst才能获得

<h1>chapter1</h1>
<select>
  <option>a</option>
  <option selected>b</option>
</select>

<h1>chapter3</h1>
  <input type="text" value="h">
</select>

如果模式简单且事先众所周知,那么也许基于键的处理就足够了:

  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:mode on-no-match="shallow-copy"/>
  
  <xsl:template match="/">
    <html>
      <head>
        <title>Example</title>
      </head>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>
  
  <xsl:template match="chapter1 | chapter2">
    <h1>{local-name()}</h1>
    <select>
      <xsl:apply-templates select="key('element-ref', name(), $schema)//xs:enumeration">
        <xsl:with-param name="value" select="."/>
      </xsl:apply-templates>
    </select>
  </xsl:template>
  
  <xsl:template match="xs:enumeration">
    <xsl:param name="value"/>
    <option><xsl:if test="$value = @value"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>{@value}</option>
  </xsl:template>
  
  <xsl:template match="chapter3">
    <h1>{local-name()}</h1>
    <input type="text" value="{.}"/>
  </xsl:template>

  <xsl:key name="element-ref" match="xs:element" use="@name"/>

假设 <xsl:param name="schema" select="doc('schema.xsd')"/>