我正在研究使用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'">
		<xsl:value-of select="name()" />: <xsl:value-of select="." />,
</xsl:if>
</xsl:template>
答案 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">
		<xsl:value-of select="name()" />: <xsl:value-of select="." />,
</xsl:template>
因此,样式模板可以被具有不同样式属性的许多“控件”重用。