0

我正在使用 orbeon 表单构建器,并希望为某些元素的类属性添加一个值。为此,我使用下面的代码,但我想知道如何优化此代码。必须可以组合每 2 个模板标签,因为唯一的区别是案例 1 我将类属性设置为一个值,而在案例 2 中我将一些文本添加到类属性..

也许甚至可以将所有这些代码组合成 1 个模板标签?(一个具有多个选择器(匹配)并具有设置/附加类属性?

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>

请帮我。谢谢,尼科

4

1 回答 1

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>
于 2013-03-18T09:35:40.420 回答