2015-01-09 4 views
0

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

<xjdf:XJDF> 
<xjdf:AuditPool> 
    <xjdf:Created TimeStamp="2013-09-03T12:07:16+02:00"> 
    <xjdf:Employee PersonalID="j.smith" Roles="Operator"/> 
    </xjdf:Created> 
</xjdf:AuditPool> 
</xjdf:XJDF> 

В этом документе я хотел бы изменить значение атрибута TimeStamp в xjdf: Созданный элемент будет пуст, как TimeStamp = "". Как это сделать с помощью xsl? Я пробовал:

<xsl:template match="//xjdf:XJDF/xjdf:AuditPool/xjdf:Created/@TimeStamp"> 
    <xsl:attribute name="TimeStamp"/> 
</xsl:template> 

но безуспешно.

ответ

1

Вы не используете xsl: атрибут правильного пути, вы всегда должны вводить декларацию выходного элемента (или в XSL, который вы нам предоставляете), что-то не хватает. Кроме того, вы не устанавливаете новое значение для атрибута.

Нечто подобное должно работать

<xsl:template match="//xjdf:XJDF/xjdf:AuditPool/xjdf:Created"> 
    <xjdf:Created> 
     <xsl:attribute name="TimeStamp"> 
     (...the new attribute value here...) 
     </xsl:attribute> 
     <xsl:attribute name=" other_attribute "> 
     (...the other attribute value here...) 
     </xsl:attribute> 

     <xsl:apply-templates /> 
    </xjdf:Created> 
    </xsl:template> 
+0

Я упомянул, что я хочу, чтобы в качестве значения атрибута был установлен пустой String. Ваше решение сработало для меня, спасибо! Как бы я изменил значение второго атрибута одного и того же элемента? –

+0

Вы просто добавляете другую инструкцию '' (обновленный ответ). – potame

0

шаблон будет делать правильные вещи, но только если есть другой шаблон (например, шаблон идентичности), что приводит к его применять - сам по себе он выиграл» t, потому что правила шаблона по умолчанию никогда не применяют шаблоны для атрибуции узлов. Вот пример идентичности на основе

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
       xmlns:xjdf="urn:example-com:xjdf"> <!-- replace URI as appropriate --> 

    <!-- identity template - copy everything as-is except where overridden --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy> 
    </xsl:template> 

    <!-- clear TimeStamp attribute --> 
    <xsl:template match="xjdf:XJDF/xjdf:AuditPool/xjdf:Created/@TimeStamp"> 
    <xsl:attribute name="TimeStamp"/> 
    </xsl:template> 

</xsl:stylesheet> 

Обратите внимание, что вам не нужно ведущий // на структуру матча, и в зависимости от структуры остальной части документа XML не может понадобиться все четыре уровня иерархии - просто match="@TimeStamp" или match="xjdf:Created/@TimeStamp" может быть достаточно точным. Если вы хотите изменить другие атрибуты, вы можете просто добавить дополнительные шаблоны, соответствующие этим, но если вы хотите добавить атрибуты new к элементу, которого не было на входе, вам нужно будет написать шаблон, соответствующий элементу сам, например

<xsl:template match="xjdf:Created"> 
    <xjdf:Created newAttribute="newValue"> 
    <xsl:apply-templates select="@*|node()" /> 
    </xjdf:Created> 
</xsl:template> 
Смежные вопросы