0

orbeonフォームビルダーを使用していて、いくつかの要素のクラス属性に値を追加したいと思います。これを行うために私は以下のコードを使用していますが、このコードを最適化する方法を知りたいです。唯一の違いは、ケース1でクラス属性を値に設定し、ケース2でクラス属性にテキストを追加することだけなので、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>

私を助けてください。ありがとう、ニコ

4

1 に答える 1

1

はい、これらのテンプレートは少し簡略化できます。お持ちの6つを次の3つに置き換えることができます。

  <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、3番目のテンプレートを削除できます。

これをさらに単純化する1つの方法は、このキーをXSLTの上部に追加することです。

  <xsl:key name="kAdjustClass" 
           match="xforms:input | fr:number | fr:textcount"
           use="name()" />

次に、上記の3つのテンプレートを次のように変更できます。

  <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 に答える