【问题标题】:How to extract element names from a XML Schema using XSLT?如何使用 XSLT 从 XML Schema 中提取元素名称?
【发布时间】:2016-09-16 14:56:52
【问题描述】:

这是一个示例 sn-p,显示元素的架构定义格式:

            <?xml version="1.0" encoding="UTF-8"?>
            <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="2.1">
            <xs:include schemaLocation="enumerations_schema.xsd"/>
            <xs:element name="xml_details" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="xml_element_1" minOccurs="0"/>
                        <xs:element name="xml_element_3" type="xs:string" minOccurs="0"/>
                        <xs:element name="xml_element_4" type="xs:decimal" minOccurs="0"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="data_details" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="data_element_1" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>Lorem ipsum</xs:documentation>
                            </xs:annotation>
                            <xs:complexType>
                                <xs:simpleContent>
                                    <xs:extension base="xs:decimal">
                                        <xs:attribute name="date" type="xs:date"/>
                                        <xs:attribute name="as_of_date" type="xs:date"/>
                                    </xs:extension>
                                </xs:simpleContent>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="data_element_2" type="xs:decimal" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>Lorem ipsum</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="data_element_3" type="xs:decimal" minOccurs="0"/>
                        <xs:element name="data_element_4" minOccurs="0">
                            <xs:complexType>
                                <xs:simpleContent>
                                    <xs:extension base="Enumeration_1">
                                        <xs:attribute name="type" type="xs:string"/>
                                    </xs:extension>
                                </xs:simpleContent>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="data_element_5" type="xs:string" minOccurs="0"/>
                        <xs:element name="data_element_6" type="xs:decimal" minOccurs="0"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>

如您所见,有两个父元素(xml_details 和 data_details)有多个子元素。我的问题是如何使用 XSLT 仅获取子元素名称(叶节点)?输出看起来像这样:

            xml_element_1
            xml_element_3
            xml_element_4
            data_element_1
            data_element_2
            data_element_3
            data_element_4
            data_element_5
            data_element_6

【问题讨论】:

    标签: xml xslt xsd xml-parsing


    【解决方案1】:

    如果您使用 XPath 表达式 //xs:element[not(.//xs:element)]/@name,您将得到您正在寻找的结果。

    【讨论】:

    • 你的意思是这样的吗?:
    • 至少在 XSLT 2.0 中我确实会这样做 &lt;xsl:value-of select="//xs:element[not(.//xs:element)]/@name" separator="&amp;10;"/&gt;。但显然有很多方法可以使用 XSLT,如果你想使用模板,那么 ` ` 为一(匹配模式中不需要前导 //)。
    • 感谢 XPath 在 xpathfiddle.net 上工作正常,但是当我在 XML Spy 或任何其他 XML 环境编辑器中打开时,它会抛出此错误:XPath 表达式中的错误未定义的命名空间前缀 - 'xs' match=" xs:element[not(.//xs:element)]"
    • Oxygen 我假设更多的编辑器默认将命名空间从您的 input-xml 中取出,因此您可以在 xpath-statements 中使用它们。也许你必须先定义 ns 前缀。搜索“注册命名空间 xpath (xmlspy)”
    • 这似乎没有捕获节点的直接第一个子元素。例如data_details 下的 data_element_1 未显示在结果中。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多