Исключить атрибут из определенного элемента xml с помощью xslt

Я новичок в xslt. У меня есть следующая проблема. Мне нужно в xml, чтобы удалить конкретный атрибут (theAttribute в примере) из определенного элемента (например, div). то есть.

<html>
   <head>...</head>
   <body>
      <div id="qaz" theAtribute="44">
      </div>
      <div id ="ddd" theAtribute="4">
         <div id= "ggg" theAtribute="9">
         </div>
      </div>
      <font theAttribute="foo" />
   </body>
</html>

чтобы стать

<html>
   <head>...</head>
   <body>
      <div id="qaz">
      </div>
      <div id ="ddd">
         <div id= "ggg">
         </div>
      </div>
      <font theAttribute="foo" />
   </body>
</html>

Если атрибут атрибута удален. Я нашел это, http://www.biglist.com/lists/xsl-list/archives/200404/msg00668.html, на основе которого я попытался найти правильное решение.

то есть. <xsl:template match="@theAtribute" />

Который удалил его из всего документа... и другие вроде совпадения, если выбрали и т.д. Ничего не работало..:-( можете ли вы, пожалуйста, помочь мне в этом? Это звучит тривиально для меня, но с xslt я не могу справиться вообще...

Спасибо всем заранее

Ответ 1

Что не работает? Вам нужен тот же контент, только без @theAtribute?

Если это так, убедитесь, что ваша таблица стилей имеет пустой шаблон для @theAtribute, но также имеет шаблон идентификации, который копирует все остальное в выходной файл:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!--empty template suppresses this attribute-->
    <xsl:template match="@theAtribute" />
    <!--identity template copies everything forward by default-->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Если вы хотите только подавить определенные @theAtribute, вы можете сделать критерии соответствия более конкретными. Например, если вы только хотели удалить этот атрибут из div who @id="qaz", вы можете использовать этот шаблон:

<xsl:template match="@theAtribute[../@id='qaz']" />

или этот шаблон:

<xsl:template match="*[@id='qaz']/@theAtribute" />

Если вы хотите удалить @theAttribute из всех элементов div, измените выражение соответствия на:

<xsl:template match="div/@theAtribute" />

Ответ 2

внутри select, вы можете исключить (или включить) этот атрибут, используя функцию name.

Например, <xsl:copy-of select="@*[name(.)!='theAtribute']|node()" />