使用 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')"/>
。
如果我的 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')"/>
。