2010-06-25 3 views
11

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

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

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

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

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

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

+0

, если вы хотите, чтобы код должны быть отформатированы, вы можете выделить код и нажмите кнопку «010101» в верхней части панели редактирования или отступ текста 4 пробела. –

ответ

22

Что не работает? вы хотите такое же содержание, только без @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 кто есть @id="qaz", то вы могли бы использовать этот шаблон:

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

или шаблон:

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

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

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

Здравствуйте, эти два я нашел, а я боюсь, но они не помогают. первый удаляет «theAtribute» извне (теги divs, body, font, etc). Второй подход удаляет всюду @theArribute из всех узлов с id = qaz. Есть ли способ для меня написать ?? что мне нужно, это сочетание этих двух, я думаю, но я не могу понять формат из-за незнания незнания xslt. I, который должен удалить атрибут из всех div и только из div. – Alexandros

+1

Я вижу. Я не понял в описании, что вы специально хотели исключить 'div/@ theAtribute'. Я обновил ответ.Если ваши XML-элементы привязаны к пространству имен, вам может потребоваться объявить пространство имен в XSLT или использовать оператор XPATH, который игнорирует пространство имен и совпадает с локальным именем (например, '* [local-name() = 'div ']/@ theAtribute') –

+0

Это сработало !!!! идеальное решение и очень быстрая реакция. Спасибо, Хансен !!!! – Alexandros

8

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

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

+0

Это хорошо сработало для меня, я хотел заменить один атрибут, а затем скопировать остальные, и это выражение хорошо работало для «остальных», – davenpcj

Смежные вопросы