2017-01-18 4 views
1

У меня есть этот XML и нужно изменить форматкак изменить имя узла с помощью XSLT

<?xml version="1.0"?> 
<request type="POST"> 
    <paths count="0"/> 
    <values count="71"> 
     <timestamp>2017-01-18T21:38:22+01:00</timestamp> 
       <CampaignId>7f27a</CampaignId> 
       <CampaignCode>CMP-01084-C5R2J5</CampaignCode> 
     <Apple> 
      <a>Appel</a> 
      <b>Appel</b> 

     </Apple> 
     <Peach> 
      <a>Appel</a> 
      <b>Appel</b> 

     </Peach> 
    </values> 
    <files count="0"/> 
    <header> 
     <ipaddress>127.0.0.1</ipaddress> 
     <reqheader>thankyou</reqheader> 
     <referer/> 
     <![CDATA[Host= localhost:8083]]> 
     <cookies/> 
    </header> 
</request> 

** Мне нужно только значения в <values> и изменить <apple>, <peach> и т.д. в <value>. Что-то вроде этого ..

<soapenv:Envelope> 
     <soapenv:Header/> 
      <soapenv:Body> 
       <timestamp>2017-01-18T21:38:22+01:00</timestamp> 
       <CampaignId>7f27a</CampaignId> 
       <CampaignCode>CMP-01084-C5R2J5</CampaignCode> 
       <value> 
        <a>Appel</a> 
        <b>Appel</b> 
       </value> 
       <value> 
        <a>Appel</a> 
        <b>Appel</b> 
       </value>  
     </soapenv:Body> 
</soapenv:Envelope> 

Потребовалось более 8 часов без какого-либо прогресса.

+0

Помог ли мой ответ? –

ответ

0

Это должно заставить вас начать. Подробнее см. Комментарии в XSLT.

Обратите внимание, что в вашем выводе используется префикс пространства имен soapenv. Для вашего вывода namespace well-formed вам необходимо привязать этот префикс к uri пространства имен.

В моем XSLT я использовал uri http://schemas.xmlsoap.org/soap/envelope/; измените это, если вам нужно.

XML Input (фиксировано быть well-formed (отсутствует </values>))

<request type="POST"> 
    <paths count="0"/> 
    <values count="71"> 
     <timestamp>2017-01-18T21:38:22+01:00</timestamp> 
     <CampaignId>7f27a</CampaignId> 
     <CampaignCode>CMP-01084-C5R2J5</CampaignCode> 
     <Apple> 
      <a>Appel</a> 
      <b>Appel</b> 
     </Apple> 
     <Peach> 
      <a>Appel</a> 
      <b>Appel</b> 
     </Peach> 
    </values> 
    <files count="0"/> 
    <header> 
     <ipaddress>127.0.0.1</ipaddress> 
     <reqheader>thankyou</reqheader> 
     <referer/> 
     <![CDATA[Host= localhost:8083]]> 
     <cookies/> 
    </header> 
</request> 

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <!--Copy any attribute or node() (element, text, comment, processing 
    instruction) without change. Override this with a more specific template 
    when needed.--> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <!--Match the root element "request" and narrow the elements being processed 
    to children of the "values" element.--> 
    <xsl:template match="/request"> 
    <soapenv:Envelope> 
     <soapenv:Header/> 
     <soapenv:Body> 
     <xsl:apply-templates select="values/*"/> 
     </soapenv:Body> 
    </soapenv:Envelope> 
    </xsl:template> 

    <!--Change the name of elements to "value" except for timestamp, 
    CampaignId, and CampaignCode. Those should be left alone.--> 
    <xsl:template match="Apple|Peach"> 
    <value> 
     <xsl:apply-templates/> 
    </value> 
    </xsl:template> 

</xsl:stylesheet> 

Выходной

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <timestamp>2017-01-18T21:38:22+01:00</timestamp> 
     <CampaignId>7f27a</CampaignId> 
     <CampaignCode>CMP-01084-C5R2J5</CampaignCode> 
     <value> 
     <a>Appel</a> 
     <b>Appel</b> 
     </value> 
     <value> 
     <a>Appel</a> 
     <b>Appel</b> 
     </value> 
    </soapenv:Body> 
</soapenv:Envelope> 

Редактировать на основе следующего комментария:

К сожалению, это изменить имя каждого узла, который имеет Чайлдс к «ценности», а не только те, таргетинга.

Это не 100% ясно, что вы только хотели предназначаться Apple и Peach (из-за «и т.д.»).