Как удалить пространство имен мыла из корневого элемента - PullRequest
0 голосов
/ 14 мая 2019

Я столкнулся с проблемой при преобразовании xslt.Я хочу удалить дополнительное пространство имен, добавленное в мой результат во время преобразования xslt.

вот мой исходный код xml:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <Root xmlns="http://www.abc123.org/xyz/ase" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <Header>           
            <CreationDateTime>2019-05-08T06:34:04.2235068-05:0011</CreationDateTime>
            <BODID>51c336d1-8e6a-46211c-973f-a9ca6c8a33ce</BODID>
            <ReferenceID>9078111e00-9b82-46b3-a419-be80521b2a94</ReferenceID>
            <Success>false</Success>
         </Header>
         <Data>
            <ErrorMessage>
               <ID/>
               <Type>Invalid Data</Type>
               <Description>InvalidData</Description>
            </ErrorMessage>
         </Data>
      </Root>
   </soapenv:Body>
</soapenv:Envelope>

вот мой код xslt:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" exclude-result-prefixes="soapenv">
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="soapenv:*">
    <xsl:apply-templates select="@* | node()" />
  </xsl:template>
</xsl:stylesheet>

Ожидаемый результат:

<Root xmlns="http://www.abc123.org/xyz/ase" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <Header>           
            <CreationDateTime>2019-05-08T06:34:04.2235068-05:0011</CreationDateTime>
            <BODID>51c336d1-8e6a-46211c-973f-a9ca6c8a33ce</BODID>
            <ReferenceID>9078111e00-9b82-46b3-a419-be80521b2a94</ReferenceID>
            <Success>false</Success>
         </Header>
         <Data>
            <ErrorMessage>
               <ID/>
               <Type>Invalid Data</Type>
               <Description>InvalidData</Description>
            </ErrorMessage>
         </Data>
</Root>

Фактический результат:

 <Root xmlns="http://www.abc123.org/xyz/ase" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
         <Header>           
            <CreationDateTime>2019-05-08T06:34:04.2235068-05:0011</CreationDateTime>
            <BODID>51c336d1-8e6a-46211c-973f-a9ca6c8a33ce</BODID>
            <ReferenceID>9078111e00-9b82-46b3-a419-be80521b2a94</ReferenceID>
            <Success>false</Success>
         </Header>
         <Data>
            <ErrorMessage>
               <ID/>
               <Type>Invalid Data</Type>
               <Description>InvalidData</Description>
            </ErrorMessage>
         </Data>
 </Root>

Здесь я получаю дополнительное пространство имен "xmlns: soapenv", которое мне нужно удалить.

Пожалуйстапредложить исправление.

Спасибо

1 Ответ

1 голос
/ 14 мая 2019

xsl:copy скопирует все пространства имен, объявленные в XML, даже если сам элемент не использует пространство имен.

Что вы можете сделать, это вместо использования xsl:copy для элементов, использовать xsl:element для создания нового элемента и копировать только те объявления пространства имен, которые вам нужны ....

Попробуйте добавить этот шаблон в XSLT

<xsl:template match="*[namespace-uri() != 'http://schemas.xmlsoap.org/soap/envelope/']" priority="2">
  <xsl:element name="{name()}" namespace="{namespace-uri()}">
    <xsl:copy-of select="namespace::*[. != 'http://schemas.xmlsoap.org/soap/envelope/']" />
    <xsl:apply-templates select="@* | node()" />  
  </xsl:element>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...