2014-12-31 2 views
0

Я довольно новое с XSLT и интересно, как изменить сообщение XML SOAP, чтобы добавить теги междуИзменение SOAP Envelope

Источник XML:

<soapenv:Envelope xmlns:soapenv="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"> 
 
    <soapenv:Body> 
 
     <DataValidationFailureFault xmlns="http://sample.com"> 
 
     <ValidationErrorList> 
 
      <ValidationError> 
 
       <ErrorCode>1234</ErrorCode> 
 
       <ErrorString>Test Error</ErrorString> 
 
      </ValidationError> 
 
     </ValidationErrorList> 
 
     </DataValidationFailureFault> 
 
    </soapenv:Body> 
 
</soapenv:Envelope>

После XSLT я хочу, чтобы XML SOAP выглядел так:

<soapenv:Envelope xmlns:soapenv="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"> 
 
    <soapenv:Body> 
 
     <soapenv:Fault> 
 
     <faultcode>HardCoded Value</faultcode> 
 
     <faultstring>HardCoded Value</faultstring> 
 
     <detail> 
 
      <DataValidationFailureFault xmlns="http://sample.com"> 
 
       <ValidationErrorList> 
 
        <ValidationError> 
 
        <ErrorCode>1234</ErrorCode> 
 
        <ErrorString>Test Error</ErrorString> 
 
        </ValidationError> 
 
       </ValidationErrorList> 
 
      </DataValidationFailureFault> 
 
     </detail> 
 
     </soapenv:Fault> 
 
    </soapenv:Body> 
 
</soapenv:Envelope>

ответ

0

Start с identity tranform. Затем напишите еще один шаблон, чтобы вмешаться в процесс копирования идентичности в нужном месте, а именно, когда обрабатывается элемент soapenv:Body.

таблицы стилей XSLT

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="soapenv:Body"> 
    <xsl:copy> 
     <soapenv:Fault> 
      <faultcode>HardCoded Value</faultcode> 
      <faultstring>HardCoded Value</faultstring> 
      <detail> 
       <xsl:apply-templates select="@*|node()"/> 
      </detail> 
     </soapenv:Fault> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

XML Output

Кстати, что вы нужны все эти неиспользуемые объявления пространства имен?

<?xml version="1.0" encoding="utf-8"?> 
<soapenv:Envelope xmlns:soapenv="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"> 
    <soapenv:Body> 
     <soapenv:Fault> 
     <faultcode>HardCoded Value</faultcode> 
     <faultstring>HardCoded Value</faultstring> 
     <detail> 
      <DataValidationFailureFault xmlns="http://sample.com"> 
       <ValidationErrorList> 
        <ValidationError> 
        <ErrorCode>1234</ErrorCode> 
        <ErrorString>Test Error</ErrorString> 
        </ValidationError> 
       </ValidationErrorList> 
      </DataValidationFailureFault> 
     </detail> 
     </soapenv:Fault> 
    </soapenv:Body> 
</soapenv:Envelope> 

EDIT

просто интересно, как я могу удалить пространство имен в DataValidationFailureFault тега?

В этом случае добавьте еще один шаблон в таблицу стилей, которая соответствует элементам в этом пространстве имен (DataValidationFailureFault и его потомков, тоже - это пространство имен по умолчанию ). Затем построить новый элемент без пространства имен для каждого из них:

<xsl:template match="sample:DataValidationFailureFault|sample:DataValidationFailureFault//*"> 
    <xsl:element name="{name()}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
</xsl:template> 

и модифицировать stylesheet элемент кода XSLT, чтобы включить объявление пространства имен для префикса sample:, а также исключить этот префикс, так как он становится неиспользованным в выход.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:sample="http://sample.com" 
exclude-result-prefixes="sample"> 
+0

Спасибо Матиас Мюллер, этот подход также работает. Я не знаком с пространством имен, но Peoplesoft автоматически генерирует это пространство имен при создании мыльного конверта. – Kabudles

+0

@Kabudles Добро пожаловать. Пожалуйста, не забудьте [** принять один из ответов **] (http://stackoverflow.com/help/someone-answers) (не обязательно мой). Благодаря! –

+0

Привет Матиас - просто любопытно, как удалить пространство имен в теге DataValidationFailureFault? – Kabudles

0

попробовать что-то вроде этого

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
           xmlns:soapenv="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" 
       xmlns:ex="http://sample.com"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/*"> 
    <soapenv:Envelope xmlns:soapenv="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"> 
     <soapenv:Body> 
     <soapenv:Fault> 
      <faultcode>HardCoded Value</faultcode> 
      <faultstring>HardCoded Value</faultstring> 
      <xsl:copy-of select="soapenv:Body/ex:DataValidationFailureFault"/> 
     </soapenv:Fault> 
     </soapenv:Body> 
    </soapenv:Envelope> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Спасибо Saurav, он работает. Я использую подобный подход, но я использую match = "/", и он не работает. Что это означает, когда вы используете/* вместо plain /? – Kabudles

+0

@Kabudles "/" означает все узлы в XML. "/ *" Означает только узлы элемента в xml – Saurav

+0

@Saurav На самом деле. '/', поскольку совпадение с шаблоном означает узел документа (самый внешний узел дерева XML), '/ *' означает самый внешний элемент узла, который охватывает все остальное. –

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