How not to copy some attributes?

2020-03-08 12:06发布

I need to copy from input document to output document all attributes but one.

My input is like this:

<mylink id="nextButton" type="next" href="javascript:;" />

And I need output like this:

<a id="nextButton" href="javascript:;" />

If I use the following XSL:

<xsl:template match="mylink">
    <a><xsl:copy-of select="attribute::*"/></a>
</xsl:template>

I get all attributes to output like this:

<a id="nextButton" type="next" href="javascript:;" />

But I want to ignore the "type" attribute. I've tried the following but none of them seems to work the way I need:

<xsl:copy-of select="attribute::!type"/>
<xsl:copy-of select="attribute::!'type'"/>
<xsl:copy-of select="attribute::*[!type]"/>
<xsl:copy-of select="attribute::not(type)"/>

How should I write my stylesheet to get needed output?

标签: xslt xpath
2条回答
爷的心禁止访问
2楼-- · 2020-03-08 12:07

In XSLT 2.0:

<xsl:template match="mylink">
  <a><xsl:copy-of select="@* except @type"/></a>
</xsl:template>
查看更多
forever°为你锁心
3楼-- · 2020-03-08 12:25

Shortest form:

<xsl:template match="mylink">
    <a><xsl:copy-of select="@*[name()!='type']"/></a>
</xsl:template>

Longer one (that's the first thing I came up with, I leave it for reference):

<xsl:template match="mylink">
    <a>
     <xsl:for-each select="@*">
      <xsl:if test="name() != 'type'">
       <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
      </xsl:if> 
     </xsl:for-each>
    </a>
</xsl:template>
查看更多
登录 后发表回答