2016-05-03 3 views
1

У меня есть этот XML:XSLT заменить атрибут и его значение

<?xml version="1.0" encoding="UTF-8"?> 
<ns2:update xmlns:ns2="urn:enterprise.soap.sforce.com"> 
    <ns2:sObjects type="Account"> 
    <ns2:Id>001b0000006mKKqAAM</ns2:Id> 
    <ns2:Name>NewName</ns2:Name> 
    </ns2:sObjects> 
</ns2:update> 

И я хочу, чтобы этот вывод:

<?xml version="1.0" encoding="UTF-8"?> 
<ns2:update xmlns:ns2="urn:enterprise.soap.sforce.com"> 
    <ns2:sObjects xsi:type="Account" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ns2:Id>001b0000006mKKqAAM</ns2:Id> 
    <ns2:Name>NewName</ns2:Name> 
    </ns2:sObjects> 
</ns2:update> 

Мне нужно изменить атрибут type="Account" к xsi:type="Account" с пространством имен xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" в элемент ns2:sObjects.

Как это сделать с помощью XSLT?

ответ

0

Я немного поиграл с этим, это то, что вы ищете?

<xsl:stylesheet version="1.0" xmlns:ns2="urn:enterprise.soap.sforce.com" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 
    <xsl:template match="/"> 
     <ns2:update xmlns:ns2="urn:enterprise.soap.sforce.com"> 
      <ns2:sObjects xsi:type="Account" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
       <ns2:Id><xsl:value-of select="/ns2:update/ns2:sObjects/ns2:Id"/></ns2:Id> 
       <ns2:Name><xsl:value-of select="/ns2:update/ns2:sObjects/ns2:Name"/></ns2:Name> 
      </ns2:sObjects></ns2:update> 
    </xsl:template> 
</xsl:stylesheet> 

Он обновляет атрибут sObjects и получает ребенок Id и Name узлы

выхода (используя вход)

<?xml version="1.0" encoding="UTF-8"?> 
<ns2:update xmlns:ns2="urn:enterprise.soap.sforce.com"> 
    <ns2:sObjects xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Account"> 
     <ns2:Id>001b0000006mKKqAAM</ns2:Id> 
     <ns2:Name>NewName</ns2:Name> 
    </ns2:sObjects> 
</ns2:update> 
+0

Параметр 'XMLNS: xml' и' XSI: атрибуты type' перевернуто вокруг, но, как правило, это не изменило бы ни – Eon

0

Добавить шаблон, как следующие тождественное преобразование:

<xsl:template match="@type[. = 'Account']"> 
    <xsl:attribute name="xsi:type" 
    namespace="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsl:value-of select="'Account'"/> 
    </xsl:attribute> 
</xsl:template> 

Если термин "ide ntity transform "ничего не говорит вам, поисковая система должна помочь.

+0

Да, это именно то, что я ищу! Большое спасибо ! –

0

очень простой таблицы стилей XSLT для достижения этой цели будет

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns2="urn:enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsl:output method="xml" /> 

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

    <!-- replaces the ns2:sObjects node with the replacement --> 
    <xsl:template match="ns2:sObjects"> 
    <ns2:sObjects xsi:type="{@type}"> 
     <xsl:apply-templates /> 
    </ns2:sObjects> 
    </xsl:template> 

</xsl:stylesheet> 

Его выход

<?xml version="1.0"?> 
<ns2:update xmlns:ns2="urn:enterprise.soap.sforce.com"> 
    <ns2:sObjects xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Account"> 
    <ns2:Id>001b0000006mKKqAAM</ns2:Id> 
    <ns2:Name>NewName</ns2:Name> 
    </ns2:sObjects> 
</ns2:update> 
Смежные вопросы