我基本上有一个这样的 XML 输入结构:
...
<box type="rectangle" class="someOriginalClass">
<background bgtype="solid" />
<animation order="3" />
... children
</box>
并想将其转换为
<div class="someOriginalClass rectangle solid animated order3">
...children
</div>
请注意,既不需要背景也不需要动画,这是一个简化的示例,这意味着可以有更多这样的属性,具有更多属性。同样,动画和背景在其他地方被重用。
到目前为止,我的 XSLT 代码是:
<xsl:template match="box">
<div class="{@someOldClass} {@type}">
<xsl:apply-templates select="./*" />
</div>
</xsl:template>
<xsl:template match="background">
<xsl:attribute name="class">
<xsl:value-of select="@bgtype"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="animation">
<xsl:attribute name="class">
animated order<xsl:value-of select="@order"/>
</xsl:attribute>
</xsl:template>
这段代码的问题是每个模板都完全覆盖了类属性,忽略了已经包含的类。
为了解决这个问题,我尝试过:
a) 重写旧类 => value-of 只获取输入 XML 类 (someOldClass)
<xsl:template match="animation">
<xsl:attribute name="class">
<xsl:value-of select="../@class"/>
animated order<xsl:value-of select="@order"/>
</xsl:attribute>
</xsl:template>
b) 而是在模板之间使用 params => 只传递一次更改,一种方式
<xsl:template match="box">
<div class="{@someOldClass} {@type}">
<xsl:apply-templates select="./*">
<xsl:with-param name="class" select="concat(@someOldClass,' ',@type)"/>
</xml:apply-templates>
</div>
</xsl:template>
<xsl:template match="animation">
<xsl:param name="class"/>
<xsl:attribute name="class">
<xsl:value-of select="$class"/>
animated order<xsl:value-of select="@order"/>
</xsl:attribute>
</xsl:template>
你看,我缺少一个可以处理任意数量的类更新并且冗余最小的解决方案。顺便说一句,我是 XSLT 初学者,所以也许有一些我还没有遇到过的命中注定的功能。
有任何想法吗?