如何使用XSLT更改节点名称

时间:2017-01-18 21:18:08

标签: xml xslt

我有这个XML,需要更改格式

<?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个多小时没有任何进展。

1 个答案:

答案 0 :(得分:0)

这应该让你开始。有关更多详细信息,请参阅XSLT中的注释。

请注意,在输出中使用名称空间前缀soapenv。要使输出为namespace well-formed,您需要将该前缀绑定到命名空间uri。

在我的XSLT中,我使用了uri http://schemas.xmlsoap.org/soap/envelope/;如果你需要改变它。

XML输入(固定为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>

根据以下评论进行编辑:

  

不幸的是,这确实会改变每个拥有子节点的节点的名称   到&#39;价值&#39;,而不仅仅是定位目标。

我并不是100%明确表示您只想定位ApplePeach(因为&#34;等等#34;)。