简体   繁体   English

使用xslt从xsd生成xml

[英]Generate xml from xsd using xslt

I have an XSD file with content as: 我有一个XSD文件,内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:simpleType name="phoneType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Voice"/>
      <xs:enumeration value="Fax"/>
      <xs:enumeration value="Pager"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="Contact">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Name">
          <xs:simpleType>
            <xs:restriction base="xs:string"></xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="Title"
                    type="xs:string" />
        <xs:element name="Phone"
                    minOccurs="1"
                    maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Number"
                          minOccurs="1">
                <xs:simpleType>
                  <xs:restriction base="xs:string"></xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="Type"
                          default="Voice"
                          minOccurs="1"
                          type="phoneType"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Using XSLT i want to generate XML like: 使用XSLT我想生成XML,如:

<Contact>
  <Name>name</Name>
  <Title>title</Title>
  <Phone>
    <Number>number</Number>
    <Type>Voice</Type>
  </Phone>
</Contact>

How to get above XML file as output of XSLT transformer? 如何将上面的XML文件作为XSLT转换器的输出?

This makes no attempt at generality but produces the requested output, and may give you a start 这不是一般性的尝试,而是产生请求的输出,并可能给你一个开始

$ saxon9 x.xsd xsdgen.xsl 
<Contact>
   <Name>name</Name>
   <Title>title</Title>
   <Phone>
      <Number>number</Number>
      <Type>Voice</Type>
   </Phone>
</Contact>

using the xsl: 使用xsl:

<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
        >
 <xsl:strip-space elements="*"/>
 <xsl:output indent="yes" omit-xml-declaration="yes"/>

 <xsl:template match="xs:element">
  <xsl:element name="{@name}">
   <xsl:apply-templates select="@type,*"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="xsl:sequence">
  <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="xs:element/xs:simpleType">
  <xsl:value-of select="lower-case(../@name)"/>
 </xsl:template>

 <xsl:template match="@type[.='xs:string']">
  <xsl:value-of select="lower-case(../@name)"/>
 </xsl:template>

 <xsl:template match="@type[not(../*)][../@default]" priority="2">
  <xsl:value-of select="../@default"/>
 </xsl:template>

</xsl:stylesheet>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM