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>

如何使用选择先前应用模板语句中未指定的所有属性的应用模板语句结束副本?

以下是正确的吗?

<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']"/>

是的,但它似乎太长了。此外,建议不要使用!=运算符,因为当它的参数之一是节点集时,它的语义(行为)不直观。

当要排除的属性名称很多时,我宁愿写成以下样式:

<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)"/>

您还可以将其简化为单个应用模板:

<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 回答