2

次のXSLTがあるとしましょう。

<xsl:template match="property">
    <xsl:copy>
        <xsl:apply-templates select="@id"/>
        <xsl:apply-templates select="@name"/>
        <xsl:apply-templates select="@componentClassID"/>
    </xsl:copy>
  </xsl:template>

以前のapply-templatesステートメントで指定されていないすべての属性を選択するapply-templatesステートメントでコピーを終了するにはどうすればよいですか?

次は正しいでしょうか?

<xsl:apply-templates select="@*[name()!='id' and name()!='name' and name()!='componentClassID']"/>
4

2 に答える 2

3

以下は正しいでしょうか?

<xsl:apply-templates select=
 "@*[name()!='id' and name()!='name' and name()!='componentClassID']"/>

はい、でも長すぎるようです!=また、引数の 1 つがノード セットである場合の直感的でないセマンティクス (動作) のため、演算子を使用しないことをお勧めします。

除外する属性名が多い場合は、次のスタイルで書きます。

<xsl:apply-templates select=
 "@*[not(contains('+id+name+componentClassID+', concat('+', name(), '+')))]"/>
于 2012-09-07T03:20:43.400 に答える
0

もちろんXSLT 2.0では使用できます

<xsl:apply-templates select="@* except (@id, @name, @class)"/>

また、適用テンプレートを 1 つに減らすこともできます。

<xsl:apply-templates select="@id, @name, @class, @* except (@id, @name, @class)"/>

繰り返しが苦手な場合は、並べ替えを使用できます。

<xsl:apply-templates select="@*">
  <xsl:sort select="f:attOrder(.)"/>
</xsl:apply-templates>

<xsl:function name="f:attOrder" as="xs:integer">
  <xsl:param name="a" as="attribute()"/>
  <xsl:variable name="ix" select="index-of(("id", "name", "class"), local-name($a))"/>
  <xsl:sequence select="($ix, 1000)[1]"/>
</xsl:function>

または (これは 1.0 でも動作します) モードを使用できます:

<xsl:apply-templates select="@id"/>
<xsl:apply-templates select="@name"/>
<xsl:apply-templates select="@componentClassID"/>
<xsl:apply-templates select="@*" mode="remainder"/>

<xsl:template match="@id|@name|@componentClassID" mode="remainder"/>
于 2012-09-07T08:09:37.410 に答える