我基本上有这样的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>
此代码的问题是每个模板都完全覆盖了class属性,从而忽略了已经包含的类。
为了解决这个问题,我尝试过:
a)重写旧类=&gt; 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 =&gt;在模板之间传递更改只有一次,单程
<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的初学者,所以也许还有一些我还没有遇到的预定功能。
有什么想法吗?
答案 0 :(得分:0)
<xsl:template match="box">
<xsl:param name="boxType" />
<li>
<xsl:variable name="boxClass">
<xsl:value-of select="$boxType"/>
<xsl:if test="@class1 = 1"> class1</xsl:if>
<xsl:if test="@class2 = 1"> class2</xsl:if>
<xsl:if test="@class3 = 1"> class3</xsl:if>
<xsl:if test="@class4 = 1"> class4</xsl:if>
<xsl:if test="@last = 1"> lnLast</xsl:if>
</xsl:variable>
<xsl:attribute name="class">
<xsl:value-of select="$boxClass"/>
</xsl:attribute>
</li>
</xsl:template>