【问题标题】:How to display default value of XML element specified in XSD using XSLT?如何使用 XSLT 显示 XSD 中指定的 XML 元素的默认值?
【发布时间】: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-EEschema-aware 处理器,您将获得预期的结果。

标签: xml xslt xsd schema


【解决方案1】:

在您的 XML 和 XSD 中使用以下 XSL

<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

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多