XSLT序列化完整的XSD

XSLT序列化完整的XSD,xslt,serialization,xsd,Xslt,Serialization,Xsd,基于中提供的关于序列化的其中一个解决方案,我尝试序列化如下内容 <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb" elementFormDefault="qualified"> <xs:annotation> <xs

基于中提供的关于序列化的其中一个解决方案,我尝试序列化如下内容

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb" elementFormDefault="qualified">
    <xs:annotation>
        <xs:documentation>
            Package Name:    Master
            version:  2
            Description: 
                This is a dummy description used for testing purposes.
        </xs:documentation>
    </xs:annotation>
      <!-- ********************************************************************************************************************
    ***         Includes
    *************************************************************************************************************************-->
    <!-- Basic Layer -->
    <xs:include schemaLocation="dummy1.xsd"/>
    <xs:include schemaLocation="dummy2.xsd"/>
    <!-- ********************************************************************************************************************
    ***         Simple Types
    *************************************************************************************************************************-->
    <xs:simpleType name="YESNO">
        <xs:restriction base="xs:string">
            <xs:enumeration value="YES"/>
            <xs:enumeration value="NO"/>
        </xs:restriction>
    </xs:simpleType>
    <!-- ********************************************************************************************************************
    ***         Simple Types
    *************************************************************************************************************************-->
    <xs:complexType name="Custom" xdb:SQLType="L2A_CUSTOM_OT">
        <xs:sequence>
            <xs:element name="Postal" type="TPostal" />
            <xs:element name="Entry" type="Entry" minOccurs="0" maxOccurs="8" />
        </xs:sequence>
    </xs:complexType>    
</xs:schema>

软件包名称:Master
版本:2
说明:
这是用于测试目的的虚拟描述。
由于我刚刚开始使用XSLT,我似乎找不到一个同时包含名称空间和注释的解决方案。为了在不丢失任何信息的情况下按原样包含所有内容,我提出了这个XSLT

<xsl:variable name="xsdresultstring">  
  <xsl:apply-templates select="$xsdresult" mode="serialize"/>
</xsl:variable>  

<!-- any element -->
<xsl:template match="*" mode="serialize">
    <xsl:text>&lt;</xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:apply-templates select="@*" mode="serialize" />
    <xsl:choose>
        <xsl:when test="node()">
            <xsl:text>&gt;</xsl:text>
            <xsl:apply-templates mode="serialize" />
            <xsl:text>&lt;/</xsl:text>
            <xsl:value-of select="name()"/>
            <xsl:text>&gt;</xsl:text>
        </xsl:when>
        <xsl:otherwise>
            <xsl:text> /&gt;</xsl:text>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<!-- Attributes -->
<xsl:template match="@*" mode="serialize">
    <xsl:text> </xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:text>="</xsl:text>
    <xsl:value-of select="."/>
    <xsl:text>"</xsl:text>
</xsl:template>

<xsl:template match="text()" mode="serialize">
    <xsl:value-of select="." />
</xsl:template>

/
/
="
"
<代码> > p>参见纯XSLT 1解决方案或考虑是否可以使用XSLT处理器(如XXPath 3支持XPath 3)来使用<代码>序列化< /代码>函数。< /P>

注意,您所示的方法不关心转义,例如<代码> > p>见纯XSLT 1解决方案,或考虑是否可以使用XSLT处理器(如XXPath 3支持XPath 3)来使用<代码>序列化< /代码>函数。


请注意,如图所示的方法并不考虑转义,例如,您要求使用XSLT编写的序列化程序,但没有说明原因。这里有很高的感染风险。请说明你的最终目标。您将显示一个已经序列化的XSD(显然)。如果要再次序列化,为什么?如果您想以某种方式对其进行处理,然后重新序列化,请使用标识转换——这比在XSLT中编写序列化程序要简单得多,因为它利用XSLT处理器中已经存在的序列化程序。我猜您可能真的想生成一个新的XSD,用引用的XSD替换
XSD:includes
。如果是这样的话,你所问的问题最好描述为扁平化而不是序列化。但这只是猜测,我们不应该这么做。你应该把你的问题写得更清楚,这样我们就知道你的目标了。想想我把自己搞糊涂了吧。我尝试增强一些默认xsd,并自动添加一些xdb:SQLType。那么胖,那么好。最终结果应加载到db中,但可变字符串大小不能超过32000个字符。因此,我需要将xsd字符串拆分为几部分。这一部分我也有些工作,但为了让它正常工作,我需要变量中XSD的长度,尝试创建像l_var1这样的文本:='XSD piece1';l_var2:='xsd piece2';插入到制表符(xsd)值(l|var1 | l|var2)中,现在正在寻找获取xsd的正确字符长度的方法。您要求使用XSLT编写序列化程序,但没有说明原因。这里有很高的感染风险。请说明你的最终目标。您将显示一个已经序列化的XSD(显然)。如果要再次序列化,为什么?如果您想以某种方式对其进行处理,然后重新序列化,请使用标识转换——这比在XSLT中编写序列化程序要简单得多,因为它利用XSLT处理器中已经存在的序列化程序。我猜您可能真的想生成一个新的XSD,用引用的XSD替换
XSD:includes
。如果是这样的话,你所问的问题最好描述为扁平化而不是序列化。但这只是猜测,我们不应该这么做。你应该把你的问题写得更清楚,这样我们就知道你的目标了。想想我把自己搞糊涂了吧。我尝试增强一些默认xsd,并自动添加一些xdb:SQLType。那么胖,那么好。最终结果应加载到db中,但可变字符串大小不能超过32000个字符。因此,我需要将xsd字符串拆分为几部分。这一部分我也有些工作,但为了让它正常工作,我需要变量中XSD的长度,尝试创建像l_var1这样的文本:='XSD piece1';l_var2:='xsd piece2';insert-into-tab(xsd)值(l|var1 | l|var2)现在正在寻找一种获得xsd的正确字符长度的方法。对于OP的文字问题,这是一个很好的答案(+1),但您真的认为刚开始使用XSLT的人想知道如何用XSLT编写序列化程序吗?对于OP的文字问题,这是一个很好的答案(+1),但您真的认为刚开始使用XSLT的人想知道如何用XSLT编写序列化程序吗?