2013-02-18 3 views
2

У меня есть XML-файл, который имеет атрибут @url для элемента <matimage>. В настоящее время существует определенное имя изображения в атрибуте @url, скажем triangle.png. Я хочу применить XSLT и изменить этот URL так, чтобы это было что-то вроде assets/images/triangle.png.Изменение атрибутов XML-документа с использованием XSLT

Я попробовал следующий XSLT:

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

    <!-- Copy everything --> 
    <xsl:template match="*"> 
    <xsl:copy> 
    <xsl:copy-of select="@*" /> 
    <xsl:apply-templates /> 
    </xsl:copy> 
    </xsl:template> 

<xsl:template match="@type[parent::matimage]"> 
    <xsl:attribute name="uri"> 
    <xsl:value-of select="NEW_VALUE"/> 
    </xsl:attribute> 
</xsl:template> 
</xsl:stylesheet> 

В качестве первого шага я попытался заменить старое значение на новое значение, но это не похоже на работу. Скажите, как добавить или добавить новое значение к существующему значению атрибута @url.

Вот пример XML:

<material> 
    <matimage url="triangle.png"> 
     Some text 
    </matimage> 
    </material> 

Желаемый результат:

<material> 
    <matimage url="assets/images/triangle.png"> 
     Some text 
    </matimage> 
    </material> 

ответ

5

Раствор для того, что вы пытаетесь достичь может быть:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

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

    <!-- Match all the attributes url within matimage elements --> 
    <xsl:template match="matimage/@url"> 
     <xsl:attribute name="url"> 
      <!-- Use concat to prepend the value to the current value --> 
      <xsl:value-of select="concat('assets/images/', .)" /> 
     </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 
+1

Я хотел бы добавить предложение здесь. Использование '' в качестве родителя оператора 'concat' не работает. Я использовал этот элемент '', и он выглядел отлично. – jaykumarark

+0

Спасибо за исправление. просто копирует узел атрибута как есть (с включенным значением). Я тестировал таблицу стилей с неправильным XML-файлом, чтобы получить правильный результат. Маленький lapsus ... извините и спасибо –