优化我的XSLT选择器

时间:2013-03-18 09:13:03

标签: xml xslt orbeon

我正在使用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

1 个答案:

答案 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:inputfr:numberfr: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>