2016-11-08 5 views
0

У меня есть следующий XML-файл:Изменение значения атрибута XML с помощью XSLT

<Book description="for beginners" name="IT Book"> 
    <Available>yes</Available> 
    <Info pages="500.</Info> 
</Book> 

Я хочу, чтобы она выглядела так:

<Book description="for pros" name="IT Book"> 
    <Available>yes</Available> 
    <Info pages="500.</Info> 
</Book> 

Я посмотрел, как изменить XML-документов надлежащим образом в Интернете. Я узнал, что в первую очередь я должен объявить шаблон для простого копирования все:

<xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*"/> 
    </xsl:copy> 
</xsl:template> 

Однако, я не знаю, как написать шаблон для фактического изменения. Спасибо, что помогли новичкам.

EDIT: Вот мой стилевых до сих пор (по просьбе UL1):

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sig="http://www.w3.org/2000/09/xmldsig#"> 
    <xsl:output indent="yes" method="xml" omit-xml-declaration="yes"/> 

    <xsl:template match="node() | @*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node() | @*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@description='for beginners'"> 
     <xsl:attribute name="{name()}"> 
      <xsl:text>for pros</xsl:text> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 
+1

добавить еще один шаблон, который соответствует вашей целевой атрибут ' для профи ' –

ответ

1

Этот вопрос уже ответил во многих других потоков. Например. XSLT: How to change an attribute value during <xsl:copy>?

В вашем случае вам нужен шаблон, который соответствует вашему атрибуту description, помимо шаблона копии копии.

<xsl:template match="@description"> <!-- @ matches on attributes, possible to restrict! --> 
    <xsl:attribute name="{name()}"> <!-- creates a new attribute with the same name --> 
    <xsl:text>for pros</xsl:text> <!-- variable statement to get your desired value --> 
    </xsl:attribute> 
</xsl:template> 

EDIT 1 (дополнительная информация причина ошибок)

Один полная, действительно, запускаемым скрипт будет:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@description[. = 'for beginners']"> 
    <xsl:attribute name="{name()}"> 
     <xsl:text>for pros</xsl:text> 
    </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Спасибо за помощь. Кажется, это правильное направление. К сожалению, я получаю сообщение об ошибке при попытке этого в моей таблице стилей xsl: xsl: attribute: Невозможно добавить атрибуты к элементу, если дети уже добавлены в элемент. – leimooo

+0

'Невозможно добавить атрибуты к элементу, если дочерние элементы уже были добавлены в элемент', возникает, когда вы создаете дочерние элементы перед добавлением атрибута в контекст (например, совпадающий по времени). изменение порядка может помочь. НО есть несколько возможностей, например. '' before '' приведет к ошибке. – uL1

+0

Разве это не то, что я уже делал в своем шаблоне для копирования? : leimooo

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