2016-09-02 2 views
0

Я хотел бы получить изменение значения атрибута и заменить подстроку элемента с XSL.XSL: Как заменить значение атрибута string AND изменить значение

XML

<...> 
    <communication type="telephone">123 456 789 </communication> 
    <communication type="telephone">789 (EXT)</communication> 
    <communication type="telephone">123 456 789 </communication> 
</...> 

должен быть

<...> 
    <communication type="telephone">123 456 789 </communication> 
    <communication type="ext">789</communication> 
    <communication type="telephone">123 456 789 </communication> 
</...> 

XSL (2,0)

<xsl:template match="communication[@type='telephone'][contains(text(),'(EXT)')]"> 
<xsl:copy> 
    <xsl:value-of select="replace(., '(EXT)', '')"/> 
    <xsl:attribute name="extension">true</xsl:attribute> 
    <xsl:apply-templates select="@*|node()"/> 
</xsl:copy> 

Saxxon заявляет «узел атрибута не может быть Creat ed после дочернего элемента содержащего элемента «

Я не смог изменить значение типа атрибута, поэтому я создал новый атрибут. Но даже с этим обходным решением я понятия не имею, как сделать оба требования (добавить атрибут И удалить подстроку) для работы.

Любая идея, решающая это, высоко ценится!

+0

Ваше название говорит «* изменение значения атрибута *» и ваш вывод показывает, что вы хотите изменить значение 'type' атрибут от «телефона» до «ext». Но ваш код добавляет новый атрибут 'extension'. Что правильно? –

+0

Извините за это. Я хотел добавить еще один атрибут «расширение» с тем же значением. – user1491184

ответ

0

Я думаю, что вы хотите

<xsl:template match="communication[@type = 'telephone' and contains(., '(EXT)')]"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:attribute name="extension">true</xsl:attribute> 
    <xsl:value-of select="replace(., '(EXT)', '')"/> 
    </xsl:copy> 
</xsl:template> 
1

Эта часть:

<xsl:value-of select="replace(., '(EXT)', '')"/> 

создает текстовый узел, который является дочерним communication. Как только вы это сделаете, вы больше не сможете создавать атрибуты communication. У вас есть две команды, которые пытаются сделать это:

<xsl:attribute name="extension">true</xsl:attribute> 

и:

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

(@*) часть.

Инструкция xsl:attribute должна быть первой - и вы действительно не хотите использовать инструкцию xsl:apply-templates здесь, так как вы уже создали весь контент самостоятельно.

Обратите внимание, что ваш replace() не заменит круглые скобки.

Конечно, вы могли бы сделать все это намного проще, выполнив всего:

<xsl:template match="communication[@type='telephone'][contains(text(),'(EXT)')]"> 
    <communication extension="true"> 
     <xsl:value-of select="replace(., '\(EXT\)', '')"/> 
    </communication> 
</xsl:template> 
Смежные вопросы