使用xslt从xsd生成xml

时间:2015-11-23 03:38:07

标签: java xml xslt xsd

我有一个内容为:

的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>

使用XSLT我想生成如下的XML:

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

如何将上述XML文件作为XSLT转换器的输出?

1 个答案:

答案 0 :(得分:2)

这不是一般性的尝试,而是产生请求的输出,并可能给你一个开始

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

使用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>