2015-02-18 3 views
0

У меня есть входной XML, в котором была изменена одна схема элементов. Итак, согласно новой схеме, я переименовал ее. Теперь для этого конкретного элемента я получаю дополнительное пространство имен в выходном XML.Удаление пространства имен для измененного элемента в XSL

Я использовал исключающие префиксы, но он не был удален. Я хочу только тот конкретный элемент, который получил переименование, чтобы удалить пространство имен. Так или иначе, XSL, который я использовал до , лишает все пространства имен, которые поступают в мыльный конверт, мыло и т. Д., А не только для конкретного элемента.

Почему только измененный элемент дает ошибку пространства имен. Я даю неправильное объявление схемы, давая новую схему для старого элемента (мое сомнение также, но изменение старой схемы не влияет) или любую другую ошибку. Любые предложения по этому поводу приветствуются.

Формат входного XML исправлен. Поэтому необходимо внести изменения только в XSLT, чтобы удалить дополнительное пространство имен, появившееся после переименованного элемента (элемент PartyDetails). Все остальные элементы и их пространство имен, контракты должны быть неповрежденными.

<?xml version="1.0" encoding="UTF-8"?> 
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header /> 
    <s:Body> 
    <MethodResponseType xmlns="http://example.test.com/Trialmethods/Run"> 
    <MessageResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <ListResponse i:nil="true" /> 
    <OptionsResponse i:nil="true" /> 
    <PartyResponse> 
    <DemoHolder> 
    <Details> 
    <ContractType> 
    <ID>001</ID> 
    <Name> 
    <FirstName>Mano</FirstName> 
    <Initial>1</Initial> 
    </Name> 
    </ContractType> 
    </Details> 
    </DemoHolder> 
    </PartyResponse> 
    </MessageResponse> 
    </MethodResponseType> 
    </s:Body> 
    </s:Envelope> 

XSLT для удаления пространства имен.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
xmlns:ns="http://example.test.com/Trialmethods/Run" 
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" 
exclude-result-prefixes="ns xsl"> 

<xsl:template match="/"> 
    <xsl:apply-templates select="*"/> 
</xsl:template> 

<!-- Identity template, provides default behavior that copies all content--> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<!-- More specific template for ns:Details that provides custom behavior --> 
<xsl:template match="ns:Details"> 
    <PartyDetails> 
     <xsl:apply-templates select="*" mode="strip"/> 
    </PartyDetails> 
</xsl:template> 

<!-- template to strip out namespaces--> 
<xsl:template match="*" mode="strip"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="@*" mode="copy"/> 
     <xsl:apply-templates select="*|text()" mode="strip"/> 
    </xsl:element> 
    </xsl:template> 
    </xsl:stylesheet> 

Выход с пустым пространством имен при переименованном элементе.

<?xml version="1.0" encoding="UTF-8"?> 
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header/> 
    <s:Body> 
    <MethodResponseType xmlns="http://example.test.com/Trialmethods/Run"> 
    <MessageResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <ListResponse i:nil="true"/> 
    <OptionsResponse i:nil="true"/> 
    <PartyResponse> 
     <DemoHolder> 
     <PartyDetails xmlns=""><ContractType> 
      <ID>001</ID> 
      <Name> 
       <FirstName>Mano</FirstName> 
       <Initial>1</Initial> 
      </Name> 
      </ContractType></PartyDetails> 
     </DemoHolder> 
    </PartyResponse> 
      </MessageResponse> 
     </MethodResponseType> 
     </s:Body> 
     </s:Envelope> 
+0

Что такое ** ** точный вывод, который вы хотите получить из исходного входного XML? –

+0

Привет, Я хочу удалить пространство имен, появившееся после модифицированного элемента PartyDetails. – Mano

+0

Разве вы не разместили это пространство имен самостоятельно? Если вы этого не хотите, зачем его там ставить? Во всяком случае, это не отвечает на мой вопрос. Пожалуйста, укажите точный результат, который вы хотите, в качестве кода. Прямо сейчас у вас есть выход до этого и выводятся после этого, и это запутывает. Кажется, вы думаете, что это нужно делать на двух или более этапах - я не вижу причин для этого. –

ответ

1

Это довольно трудно следовать вашему вопросу, и там, кажется, некоторые опечатки в вашем XML, XSL, но здесь идет ...

Я предполагаю, что ваш входной документ XML, который вы пытаетесь перевести является:

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <MyRequest> 
      <ns:Details xmlns:ns="www.newschema"> 
       <ID>123</ID> 
       <Name> 
        <FirstName>John</FirstName> 
       </Name> 
      </ns:Details> 
     </MyRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

Если выходной XML вы хотите после перевода:

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <MyRequest> 
      <PartyDetails> 
       <ID>123</ID> 
       <Name> 
        <FirstName>John</FirstName> 
       </Name> 
      </PartyDetails> 
     </MyRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

п что-то вроде следующего XSLT будет работать:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ns="www.newschema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" exclude-result-prefixes="ns xsl"> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="*"/> 
    </xsl:template> 

    <!-- Identity template, provides default behavior that copies all content into the output --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- More specific template for ns:Details that provides custom behavior --> 
    <xsl:template match="ns:Details"> 
     <PartyDetails> 
      <xsl:apply-templates select="*" mode="strip"/> 
     </PartyDetails> 
    </xsl:template> 

    <!-- template to strip out namespaces--> 
    <xsl:template match="*" mode="strip"> 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="@*" mode="copy"/> 
      <xsl:apply-templates select="*|text()" mode="strip"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Как я уже говорил, кажется, вы иметь некоторые опечатки в вашем XML/XSL

  1. xmlsns:ns вместо xmlns:ns
  2. <xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> вместо <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  3. <xsl:template match="Details" ns=www.Newschema> вместо <xsl:template match="ns:Details">

Хорошо, так как вы обновили свой вопрос, чтобы использовать мой XSL, я могу видеть <PartyDetails xmlns="">, о котором вы говорите. Как насчет следующего:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns="http://example.test.com/Trialmethods/Run" xmlns:ns="http://example.test.com/Trialmethods/Run" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" exclude-result-prefixes="xsl"> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="*"/> 
    </xsl:template> 
    <!-- Identity template, provides default behavior that copies all content--> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <!-- More specific template for ns:Details that provides custom behavior --> 
    <xsl:template match="ns:Details"> 
     <xsl:element name="PartyDetails"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Я установил пространство имен по умолчанию xmlns="http://example.test.com/Trialmethods/Run", но вам также нужен xmlns:ns="http://example.test.com/Trialmethods/Run" на матч на ns:Details работать, а также удаление ns из exclude-result-prefixes="xsl". Я также удалил шаблон в режиме полосы. Для меня это производит вывод:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header/> 
    <s:Body> 
     <MethodResponseType xmlns="http://example.test.com/Trialmethods/Run"> 
      <MessageResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
       <ListResponse i:nil="true"/> 
       <OptionsResponse i:nil="true"/> 
       <PartyResponse> 
        <DemoHolder> 
         <PartyDetails> 
          <ContractType> 
           <ID>001</ID> 
           <Name> 
            <FirstName>Mano</FirstName> 
            <Initial>1</Initial> 
           </Name> 
          </ContractType> 
         </PartyDetails> 
        </DemoHolder> 
       </PartyResponse> 
      </MessageResponse> 
     </MethodResponseType> 
    </s:Body> 
</s:Envelope> 
+0

Работал как шарм @ptha. Это результат, который я ищу. Позаботьтесь, чтобы объяснить, почему это сработало, чем мое решение, которое удаляет все пространства имен. Благодарю. – Mano

+0

Наблюдение. Это успешно удаляет пространство имен из элемента, но не заполняет его как SOAP-конверт. Он печатает снаружи, как обычный текст. – Mano

+0

Привет, как я могу видеть мыльный конверт выше xsl by @ptha. и как лучше всего можно изучить эту концепцию применения шаблонов и трансформации идентичности. – Mano

Смежные вопросы