XSL威尼斯盲人

时间:2014-10-14 14:35:17

标签: xslt xsd

有没有人可以帮助我使用XSLT将XSD从Venetian Blind转换为俄罗斯娃娃设计?我在Stack Overflow上阅读了一篇关于反向的文章:Russian doll to Venetian blind xsl transformation

1 个答案:

答案 0 :(得分:1)

在同事的帮助下,我终于得到了答案。它可能不是很优雅,但它符合我的迫切需求,在这里:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    exclude-result-prefixes='exsl'
    version="2.0"
    xmlns:com="http://canaldigital.com/tsi/XSD/V5.00"
    xmlns:exsl="http://exslt.org/common"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    >

    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="xsd:complexType">
       <xsl:copy>
           <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
       </xsl:copy>
    </xsl:template>

    <xsl:template name="complexTypeElemEmbedded">
        <xsl:param name="typeName"></xsl:param>
        <xsl:variable name="typeNameNoNS" select="substring-after($typeName, ':')" />
        <xsd:complexType>
            <xsl:apply-templates select="//xsd:complexType[@name=$typeNameNoNS]/node()"></xsl:apply-templates>
        </xsd:complexType>
    </xsl:template>

    <xsl:template match="xsd:element[@type]">
        <xsl:choose>
            <!-- All simple types have a name ending in the literal 'Type' -->
            <xsl:when test="(ends-with(@type, 'Type'))">
                <xsl:copy>
                    <xsl:apply-templates select="@*|node()"/>
                </xsl:copy>
            </xsl:when>
            <!-- this picks up the global complex types -->
            <xsl:otherwise>
                <xsl:copy>
                    <xsl:copy-of select="@*[(name()!='type')]"/>
                    <xsl:call-template name="complexTypeElemEmbedded">
                        <xsl:with-param name="typeName" select="@type"/>
                    </xsl:call-template>
                </xsl:copy>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>