我正在使用orbeon表单构建器,并希望为某些元素的class属性添加值。要做到这一点,我正在使用下面的代码,但我想知道如何优化此代码。必须可以组合每个2个模板标签,因为唯一的区别是情况1我将类属性设置为值,并且在情况2中我将一些文本添加到类属性..
也许甚至可以将所有这些代码组合成1个模板标签? (一个有多个选择器(匹配)和一个set / append类属性?
Case 1:
<xsl:template match="xforms:input/@id">
<xsl:attribute name="id" select="."/>
<xsl:attribute name="class">tsbinput-<xsl:value-of select="."/></xsl:attribute>
</xsl:template>
Case 2:
<xsl:template match="xforms:input/@class">
<xsl:attribute name="class"><xsl:value-of select="."/> tsbinput-<xsl:value-of select="../@id"/></xsl:attribute>
</xsl:template>
Case 1:
<xsl:template match="fr:number/@id">
<xsl:attribute name="id" select="."/>
<xsl:attribute name="class">tsbinput-<xsl:value-of select="."/></xsl:attribute>
</xsl:template>
Case 2:
<xsl:template match="fr:number/@class">
<xsl:attribute name="class"><xsl:value-of select="."/> tsbinput-<xsl:value-of select="../@id"/></xsl:attribute>
</xsl:template>
Case 1:
<xsl:template match="fr:textcount/@id">
<xsl:attribute name="id" select="."/>
<xsl:attribute name="class">tsbinput-<xsl:value-of select="."/></xsl:attribute>
</xsl:template>
Case 2:
<xsl:template match="fr:textcount/@class">
<xsl:attribute name="class"><xsl:value-of select="."/> tsbinput-<xsl:value-of select="../@id"/></xsl:attribute>
</xsl:template>
请帮帮我。 谢谢,Nico
答案 0 :(得分:1)
是的,这些模板可以简化一下。你可以用这三个替换你拥有的六个:
<xsl:template match="@id[parent::xforms:input or
parent::fr:number or
parent::fr:textcount]">
<xsl:copy />
<xsl:attribute name="class">
<xsl:value-of select="concat(../@class, ' tsbinput-', .)"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="@class[../@id]
[parent::xforms:input or
parent::fr:number or
parent::fr:textcount]" />
<xsl:template match="@class[not(../@id)]
[parent::xforms:input or
parent::fr:number or
parent::fr:textcount]">
<xsl:copy />
</xsl:template>
如果可以保证xforms:input
,fr:number
和fr:textcount
总是具有@id
属性,那么您可以删除第三个模板。
进一步简化此操作的一种方法是将此密钥添加到XSLT的顶部:
<xsl:key name="kAdjustClass"
match="xforms:input | fr:number | fr:textcount"
use="name()" />
然后您可以将以上三个模板更改为:
<xsl:template match="@id[key('kAdjustClass', name(..))]">
<xsl:copy />
<xsl:attribute name="class">
<xsl:value-of select="concat(../@class, ' tsbinput-', .)"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="@class[../@id][key('kAdjustClass', name(..))]" />
<xsl:template match="@class[not(../@id)][key('kAdjustClass', name(..))]">
<xsl:copy />
</xsl:template>