2016-11-14 3 views
0

Это мой XML с SOAP заголовка и тела:XSLT - Удаление префикса пространства имен конкретных узлов XML

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <RequestResponse xmlns="http://tempuri.org/"> 
      <a:RequestResult xmlns:a="http://schemas.datacontract.org/2004/07/MockupTesting" 
      xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
       <a:Message>Message text testing.</a:Message> 
       <a:Response>false</a:Response> 
      </a:RequestResult> 
     </RequestResponse> 
    </s:Body> 
</s:Envelope> 

мне нужно удалить только префикс из RequestResult узла. Из этого

<a:RequestResult xmlns:a="http://schemas.datacontract.org/2004/07/MockupTesting" 
      xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 

To:

<RequestResult xmlns:a="http://schemas.datacontract.org/2004/07/MockupTesting" 
      xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 

Это XSLTконфигурационный файл, который я использую с версии 2:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output omit-xml-declaration="yes" indent="yes" /> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/"> 
     <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
      <s:Body> 
       <xsl:apply-templates /> 
      </s:Body> 
     </s:Envelope> 
    </xsl:template> 

    <xsl:template match="RequestResult |RequestResult//*"> 
     <xsl:element name="a:{name()}" 
      namespace="http://schemas.datacontract.org/2004/07/Testing"> 
      <xsl:namespace name="a" 
       select="'http://schemas.datacontract.org/2004/07/MockupTesting'" /> 
      <xsl:namespace name="i" 
       select="'http://www.w3.org/2001/XMLSchema-instance'" /> 
      <!-- <xsl:copy-of select="namespace::*" /> --> 
      <xsl:apply-templates select="node()|@*" /> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

Что нужно добавить или изменить, чтобы удалить что префикс на этом узле?

+1

Вы не можете «удалить» префикс пространства имен , и в подавляющем большинстве случаев вам не нужно делать ничего подобного. Можете ли вы объяснить, почему, по вашему мнению, это необходимо в вашем случае? – Tomalak

+0

Потому что WSDL, который я потребляю, требует @Tomalak – gtx911

+0

Извините, это не удовлетворительное объяснение. Я спросил: «Зачем вам это нужно?» и ты ответил: «Потому что мне это нужно». Я думаю, вам нужно дать более вескую причину. – Tomalak

ответ

0

Вы не можете «удалить префикс» из узла. Префикс является частью имени узла. Чтобы удалить префикс, необходимо создать новый узел с другим именем и, возможно, - как в вашем примере - в другом пространстве имен:

XSLT 2,0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:a="http://schemas.datacontract.org/2004/07/MockupTesting"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="a:RequestResult"> 
    <xsl:element name="RequestResult" namespace="http://tempuri.org/"> 
     <xsl:copy-of select="namespace::*"/> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

Но если я добавлю это пространство имен, это не сработает – gtx911

+0

@ gtx911 Пожалуйста, прекратите говорить в загадках. Вышеуказанное преобразование дает ** точный ** результат, о котором вы просили. Если вы хотите что-то еще, отредактируйте свой вопрос и уточните. То же самое относится и к вашему другому вопросу: http://stackoverflow.com/a/40589393/3016153 –