【发布时间】:2014-07-21 21:46:57
【问题描述】:
您可以在随附的 XSD 文档中为 XML 文档中的元素或属性定义默认值。下面我给出XSD、XML和XSLT文档的相关部分以及输出。
XSD:
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="testelement" maxOccurs="unbounded" default="666">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:integer">
<xs:attribute name="testattribute" type="xs:string" default="xxx" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
XML:
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="xsd3.xsd">
<testelement testattribute="aaa">1234</testelement>
<testelement testattribute="bbb">2345</testelement>
<testelement testattribute="ccc" />
<testelement>4567</testelement>
<testelement testattribute="eee">5678</testelement>
</root>
XSLT:
<xsl:template match="root">
...
<body>
<xsl:for-each select="testelement">
<xsl:value-of select="@testattribute" />
<xsl:text> : </xsl:text>
<xsl:value-of select="."/>
<br />
</xsl:for-each>
</body>
输出:
aaa : 1234
bbb : 2345
ccc :
: 4567
eee : 5678
这不是我所期望的。我希望在第三行看到“ccc:666”,在第四行看到“xxx:4567”。指定默认值很容易,但是像answer 中提到的那样显示这些默认值有那么难吗?我认为值得再问一次,因为答案已经超过 4 年了,而且比指定默认值要困难得多。
【问题讨论】:
-
你试过上一个问题的答案了吗?它是复杂的,但正如答案中所解释的那样,它是必要的。而且我认为 XSLT 不再具有模式感知能力。
-
没有。我目前正在准备 XML 考试,我想到了这个问题。指定所有默认值而不提及如何显示它们怎么办?如果只需要一个简单的函数调用,我可能会将其添加到我的摘要中,但答案的复杂性远远超出了课程中提到的任何内容,因此我将其添加为书签以备不时之需。跨度>
-
架构感知依赖于实现。如果您使用 Saxon-EE 等 schema-aware 处理器,您将获得预期的结果。