如何使用XSLT显示在XSD中指定的XML元素的默认值?

时间:2014-06-01 18:54:51

标签: xml xslt xsd schema

您可以在随附的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年,而且指定默认值要困难得多。

1 个答案:

答案 0 :(得分:0)

将以下XSL与XML和XSD一起使用

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output method="html" indent="yes"/>
    <xsl:template match="root">
        <html>
            <body>
                <xsl:for-each select="testelement">
                    <xsl:variable name="key">
                        <xsl:choose>
                            <xsl:when test="@testattribute">
                                <xsl:value-of select="@testattribute"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <!-- Read default value from Schema -->
                                <xsl:value-of select="document('xsd3.xsd')/xs:schema/xs:element[@name='root']/xs:complexType/xs:sequence/xs:element[@name='testelement']/xs:complexType/xs:simpleContent/xs:extension/xs:attribute[@name='testattribute']/@default"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:variable>
                    <xsl:variable name="value">
                        <xsl:choose>
                            <xsl:when test="text()">
                                <xsl:value-of select="."/>
                            </xsl:when>
                            <xsl:otherwise>
                                <!-- Read default value from Schema -->
                                <xsl:value-of select="document('xsd3.xsd')/xs:schema/xs:element[@name='root']/xs:complexType/xs:sequence/xs:element[@name='testelement']/@default"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:variable>

                    <xsl:value-of select="$key" />
                    <xsl:text> : </xsl:text>
                    <xsl:value-of select="$value" />
                    <br />
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

输出:

aaa : 1234
bbb : 2345
ccc : 666
xxx : 4567
eee : 5678