使用XSL显示属性使用XSD定义的默认值
问题描述:
我认为这应该很容易找到,但经过一番搜索之后,我发现这可能很好地定义清楚。使用XSL显示属性使用XSD定义的默认值
在我的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'属性的值对于非指定值是空的,而我希望显示(或选择)默认值。
现在:
- 棒型: ''
- 棒型: '默认'
- 棒型: '巧克力'
期望:
- 棒型:“默认'
- 棒型: '默认'
- 棒型: '巧克力'
现在,这应该是很简单的,不是吗?
答
也许我overgeneralizing,但如果要加载从模式的默认值,则需要沿着此线的东西:
<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>
感谢您的答复。对于在XSD级别很容易定义的值来说,看起来有点像'工作'。我理解非价值不被显示的原因,但我真的期望更简单的方法回到默认值。 (类似于xsl:value-of-or-default) 正如您可能已经猜到的那样,我对XSL相当陌生,但几乎没有发现表面。 – 2009-12-08 12:32:50
XSLT与您可能认为的XML Schema不太一样。它是一种XML转换语言,它可以将Schema看作另一个XML文档。这是我在这里做的。 XSLT并不关心你的XML是否对模式有效,它只需要格式良好。没有'xsl:value-of-or-default'。 – Tomalak 2009-12-08 13:37:33
我了解您提供的方法。 我只是猜测,因为XSL'通过XPath选择'找到'属性值,并且这需要正确的名称空间映射,它将更加意识到XSD所强加的定义和限制。 您是否同意我的看法,这不是一个奇怪的问题? – 2009-12-08 17:11:34