XSLT用于声明性语言

时间:2009-07-01 11:19:17

标签: xslt xpath

我正在研究使用XSLT将基于XML的声明性语言转换为纯JavaScript代码作为其输出。声明性语言将用于描述类似于Mozilla XUL的用户界面。我是XSLT的新手,我不知道如何正确处理标签可以包含的所有属性。例如,下面我有一个“脚本”标签和一个“按钮”标签,两者都有不同的属性,其中很多都是可选的。还会有许多其他标签具有更多属性。我的问题是,如何设计我的XSLT脚本以便以可维护的方式正确处理所有可能的属性?

<window>
    <script type="javascript">
        blah
        blah        
    </script>   
    <button id="button1" height="100" vOffset="0" renderer="Test.control.Button" /> 
</window>

我最初想的是以下内容

<xsl:template match="button">       
    var <xsl:value-of select="@id" /> = new <xsl:value-of select="@renderer" />({           
        id: <xsl:value-of select="@id" />,
        styles: {
            <xsl:apply-templates select="@*" />             
        },
    }).appendTo(panel);
</xsl:template>

<xsl:template match="button/@*">
    <xsl:if test="name() = 'height' or name() = 'vOffset'">
        &#9;&#9;<xsl:value-of select="name()" />: <xsl:value-of select="." />,
    </xsl:if>   
</xsl:template>

1 个答案:

答案 0 :(得分:0)

可能有很多不同的方法来做同样的事情。上面给出的示例是一个非常声明的方法,并且是XSLT如何处理与其他语言截然不同的一个很好的示例。

您还可以使用循环上面“按钮”模板中的属性。

另一种选择可能是提供通用样式属性模板,并为其提供不同的模式:

<xsl:template match="button">           
    var <xsl:value-of select="@id" /> = new <xsl:value-of select="@renderer" />({               
        id: <xsl:value-of select="@id" />,
        styles: {
            <xsl:apply-templates select="@height | @vOffset" mode="style"/>                         
        },
    }).appendTo(panel);
</xsl:template>

<xsl:template match="@*" mode="style">
    &#9;&#9;<xsl:value-of select="name()" />: <xsl:value-of select="." />,
</xsl:template>

因此,样式模板可以被具有不同样式属性的许多“控件”重用。