2015-02-24 4 views
1

Привет У меня есть проблема в объявлении пространства имен по умолчанию. выходные элементы xml добавляются с пространством имен по умолчанию.XSLT копия/копирование без сохранения пространств имен

Входной XML похож

<m:Request xmlns:m="http://www.NeededNamespace/1.4.0"> 
 
     <Details> 
 
      <Records>50</Records> 
 
      <Start>1</Start> 
 
      <sortName>sortName</sortName> 
 
     </Details> 
 
     <search> 
 
      <criteria> 
 
       <comparative> 
 
        <Comparative>exactMatch</Comparative> 
 
       </comparative> 
 
       <name>STATECODE</name> 
 
       <value>CO</value> 
 
      </criteria> 
 
      <criteria> 
 
       <comparative> 
 
        <Comparative>exactMatch</Comparative> 
 
       </comparative> 
 
       <name>Version</name> 
 
       <value>4.0</value> 
 
      </criteria> 
 
      <criteria> 
 
       <comparative> 
 
        <Comparative>contains</Comparative> 
 
       </comparative> 
 
       <name>LEGALNAME</name> 
 
       <value>Citizens State Bank</value> 
 
      </criteria> 
 
     </search> 
 
     </m:Request>

XSLT выглядеть

<xsl:stylesheet version="1.0" exclude-result-prefixes="t" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:t="http://www.NotRequirednamespace.com"> 
 
    <xsl:output indent="yes" method="xml" encoding="utf-8" omit-xml-declaration="yes"/> 
 
    <xsl:strip-space elements="*"/> 
 
    <!--Stylesheet to remove all namespaces from a document--> 
 
    <!--NOTE: this will lead to attribute name clash, if an element contains 
 
     two attributes with same local name but different namespace prefix--> 
 
    <!--Nodes that cannot have a namespace are copied as such--> 
 
    <xsl:template match="/"> 
 
     <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
 
     <soap:Header> 
 
      <xys:To xmlns:xys="http://services.xys.com/framework/xysHeader/v2"> 
 
       <xys:version>9.0</xys:version> 
 
       <xys:serviceName>DetailsManagement</xys:serviceName> 
 
       <xys:QOS>DEFAULT</xys:QOS> 
 
       <xys:operation>GetDetails</xys:operation> 
 
      </xys:To> 
 
      <ConsumerInfo xmlns="http://services.xys.com/framework/xysHeader/v2"> 
 
       <xysApplicationName>SAP</xysApplicationName> 
 
       <xysCheckPermission>-1</xysCheckPermission> 
 
       <xysConsumerPlatform>CS</xysConsumerPlatform> 
 
       <xysLanguage>en</xysLanguage> 
 
       <xysLocale>US</xysLocale> 
 
       <xysLogLevel>false</xysLogLevel> 
 
      </ConsumerInfo> 
 
      <HeaderMetadata xmlns="http://services.xys.com/framework/xysHeader/v2"> 
 
       <metadataContractVersion>2.0</metadataContractVersion> 
 
       <Id>414</Id> 
 
       <Timestamp>2014-11-20T14:17:30.908-0500</Timestamp> 
 
      </HeaderMetadata> 
 
      <xys:favouriteSausage xmlns:xys="http://services.xys.com/framework/xysHeader/v2">cumberland</xys:favouriteSausage> 
 
     </soap:Header> 
 
     <soap:Body> 
 
      <GetDetails xmlns="http://www.NeededNamespace/1.4.0"> 
 
       <Message id="" version="" bodyType="FS-XML" timeStampCreated="2015-10-11T10:15:25.9144403-04:00" sourceLogicalId="" xmlns="http://www.ibm.com/industries/xys"> 
 
        <ACGroup bodyCategory="" TPMode="RespondError"/> 
 
        <COMMAND> 
 

 
        <xsl:apply-templates/> 
 

 
        </COMMAND> 
 
       </Message> 
 
      </GetDetails> 
 
     </soap:Body> 
 
     </soap:Envelope> 
 
    </xsl:template> 
 

 
    <!--template to copy elements--> 
 
    <xsl:template match="*"> 
 
     <xsl:element name="{local-name()}" namespace="http://www.NeededNamespace/1.4.0"> 
 
     <xsl:apply-templates select="@* | node()"/> 
 
     </xsl:element> 
 
    </xsl:template> 
 

 
    <!--template to copy attributes--> 
 
    <xsl:template match="@*"> 
 
     <xsl:attribute name="{local-name()}"> 
 
     <xsl:value-of select="."/> 
 
     </xsl:attribute> 
 
    </xsl:template> 
 

 
    <!--template to copy the rest of the nodes--> 
 
    <xsl:template match="comment() | text() | processing-instruction()"> 
 
     <xsl:copy/> 
 
    </xsl:template> 
 

 
</xsl:stylesheet>

Вывод XML, что я получаю

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
 
<soap:Header> 
 
<xys:To xmlns:xys="http://services.xys.com/framework/xysHeader/v2"> 
 
<xys:version>9.0</xys:version> 
 
<xys:serviceName>DetailsManagement</xys:serviceName> 
 
<xys:QOS>DEFAULT</xys:QOS> 
 
<xys:operation>GetDetails</xys:operation> 
 
</xys:To> 
 
<ConsumerInfo xmlns="http://services.xys.com/framework/xysHeader/v2"> 
 
<xysApplicationName>SAP</xysApplicationName> 
 
<xysCheckPermission>-1</xysCheckPermission> 
 
<xysConsumerPlatform>CS</xysConsumerPlatform> 
 
<xysLanguage>en</xysLanguage> 
 
<xysLocale>US</xysLocale> 
 
<xysLogLevel>false</xysLogLevel> 
 
</ConsumerInfo> 
 
<HeaderMetadata xmlns="http://services.xys.com/framework/xysHeader/v2"> 
 
<metadataContractVersion>2.0</metadataContractVersion> 
 
<Id>414</Id> 
 
<Timestamp>2014-11-20T14:17:30.908-0500</Timestamp> 
 
</HeaderMetadata> 
 
<xys:favouriteSausage xmlns:xys="http://services.xys.com/framework/xysHeader/v2">cumberland</xys:favouriteSausage> 
 
</soap:Header> 
 
<soap:Body> 
 
<GetDetails xmlns="http://www.NeededNamespace/1.4.0"> 
 
<Message xmlns="http://www.ibm.com/industries/xys" id="" version="" bodyType="FS-XML" timeStampCreated="2015-10-11T10:15:25.9144403-04:00" sourceLogicalId=""> 
 
<ACGroup bodyCategory="" TPMode="RespondError"/> 
 
<COMMAND> 
 
<Request xmlns="http://www.NeededNamespace/1.4.0"> 
 
<Details> 
 
<Records>50</Records> 
 
<Start>1</Start> 
 
<sortName>sortName</sortName> 
 
</Details> 
 
<search> 
 
<criteria> 
 
<comparative> 
 
<Comparative>exactMatch</Comparative> 
 
</comparative> 
 
<name>STATECODE</name> 
 
<value>CO</value> 
 
</criteria> 
 
<criteria> 
 
<comparative> 
 
<Comparative>exactMatch</Comparative> 
 
</comparative> 
 
<name>Version</name> 
 
<value>4.0</value> 
 
</criteria> 
 
<criteria> 
 
<comparative> 
 
<Comparative>contains</Comparative> 
 
</comparative> 
 
<name>LEGALNAME</name> 
 
<value>Citizens State Bank</value> 
 
</criteria> 
 
</search> 
 
</Request> 
 
</COMMAND> 
 
</Message> 
 
</GetDetails> 
 
</soap:Body> 
 
</soap:Envelope>

Но в результате я получаю элемент как

<Request xmlns="http://www.NeededNamespace/1.4.0"> 

Но я хочу, чтобы результат бирку, как показано ниже

<Request> 

Я не хочу переопределить пространство имен, которое уже объявлено в ro ot тег того же самого. Я пробовал все варианты, которые я знал и пробовал последние несколько дней. не могли бы вы помочь мне в этом.

+0

Пожалуйста, напишите ** полный **, точный результат, который вы хотели бы получить. –

ответ

1

Элемент ввода имеет расширенное имя (local-part = "Request", namespace = "http: //www.NeededNamespace/1.4.0"). Если вы не хотите, чтобы элемент запроса вывода имел объявление пространства имен, то предположительно вы хотите, чтобы он находился в том же пространстве имен, что и его родительский элемент, то есть вы хотите, чтобы его расширенное имя было (local-part = «Request», namespace = "http://www.ibm.com/industries/xys"). Команда xsl: copy или xsl: copy никогда не будет (даже в версии 2.0) изменять расширенное имя копируемого элемента. Таким образом, вы не можете достичь желаемого результата с помощью xsl: copy или xsl: copy-of. Вам нужно будет создать новый элемент с тем же локальным именем, но другое пространство имен из оригинала, используя <xsl:element name="{local-name()}" namespace="http://www.ibm.com/industries/xys"/>.

+0

Спасибо, Майкл Кей. Ваше решение сработало. :) Извинения за последнее обновление. – Simbu

+0

Соглашение SO не должно благодарить ответчика в комментарии, но нажмите на отметку рядом с ответом, чтобы отметить ответ как принятый. Это полезно для всех, кто приходит позже и находит вопрос в результате поиска. –