从架构xsd中删除引用

时间:2014-10-07 19:04:00

标签: java xml xsd schema

有人知道,如何转换xsd String包含对没有'ref'属性的String的引用?

例如我有架构:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:pref="http://someaddr.com" elementFormDefault="qualified" targetNamespace="http://otheraddr.com">
   <xs:element name="rootElem">
     <xs:complexType>
       <xs:sequence>
         <xs:element ref="pref:elem1"/>
         <xs:element ref="pref:elem2"/>
       </xs:sequence>
     </xs:complexType>
   </xs:element>
   <xs:element name="elem1" type="xs:string"/>
   <xs:element name="elem2" type="xs:string"/>
</xs:schema>

我希望将其转换为:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:pref="http://someaddr.com" elementFormDefault="qualified" targetNamespace="http://otheraddr.com">
   <xs:element name="rootElem">
     <xs:complexType>
       <xs:sequence>
         <xs:element name="elem1" type="xs:string"/>
         <xs:element name="elem2" type="xs:string"/>
       </xs:sequence>
     </xs:complexType>
   </xs:element>
</xs:schema>

我正在寻找一些函数,例如xerces libs,但我找不到任何东西。另外用Java编写它会带来很多困难。

1 个答案:

答案 0 :(得分:1)

描述此转换的XSLT样式表可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    >

  <!-- transform all attributes and nodes as themselves,
       except where a more selective rule applies -->
  <xsl:template match="@*|node()" mode="#all">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <!-- transform xs:element elements with ref attributes
       as a copy of the referenced schema-level xs:element -->
  <xsl:template match="xs:element[@ref]">
    <xsl:variable name="ref-name" select="@ref" as="xs:string" />
    <!-- the mode specified below doesn't matter; it just
         mustn't be the default mode -->
    <xsl:apply-templates
        select="/xs:schema/xs:element[@name=$ref-name]"
        mode="inline" />
  </xsl:template>

  <!-- in the default mode, transform schema-level
       xs:element elements to nothing -->    
  <xsl:template match="/xs::schema/xs:element[@name]" />

</xsl:stylesheet>

请注意,无论实现如何,请求的操作都可能需要无限递归。