2014-01-08 3 views
0

Мне нужно внести определенные изменения в мой XML-вход, в зависимости от определенных условий. Я использую XSLT 1.0.Добавление нового элемента xml и изменение значения элемента внутри одного и того же родительского элемента

  1. значение message_type элемент (дочерний элемент m_cotrol) должен быть изменен
  2. должен быть добавлен новый элемент message_status (как дочерний элемент m_control).

Эти изменения отражены в ожидаемом выходном XML. С моим текущим XSLT-кодом я могу только выполнить второе требование.

Входной XML:

<?xml version="1.0"?> 
<message xmlns="http://www.origoservices.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <m_control> 
    <control_timestamp>2013-04-12T09:24:38.902</control_timestamp> 
    <message_id>a50ec030-72ab</message_id> 
    <retry_number>0</retry_number> 
    <message_type>Request</message_type> 
    <message_version>test.XSD</message_version> 
    <expected_response_type>synchronous</expected_response_type> 
    <initiator_id>FST</initiator_id> 
    <initiator_orchestration_id>1637280</initiator_orchestration_id> 
    <responder_id>mycomp</responder_id> 
    </m_control> 
    <m_content> 
    <b_control> 
     <service_provider_reference_number>650971</service_provider_reference_number> 
     <intermediary_case_reference_number>Sample1</intermediary_case_reference_number> 
     <quote_type>Comparison</quote_type> 
     <quote_or_print>Print</quote_or_print> 
     <message_version_number>3.7</message_version_number> 
     <submission_date>0001-04-12</submission_date> 
    </b_control> 
    </m_content> 
</message> 

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

<message xmlns="http://www.origoservices.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <m_control> 
    <control_timestamp>2013-04-12T09:24:38.902</control_timestamp> 
    <message_id>a50ec030-72ab</message_id> 
    <retry_number>0</retry_number> 
    <message_type>Response</message_type> 
    <message_version>test.XSD</message_version> 
    <expected_response_type>synchronous</expected_response_type> 
    <initiator_id>FST</initiator_id> 
    <initiator_orchestration_id>1637280</initiator_orchestration_id> 
    <responder_id>mycomp</responder_id> 
    <message_status>User not allowed access</message_status> 
    </m_control> 
    <m_content> 
    <b_control> 
     <service_provider_reference_number>650971</service_provider_reference_number> 
     <intermediary_case_reference_number>Sample1</intermediary_case_reference_number> 
     <quote_type>Comparison</quote_type> 
     <quote_or_print>Print</quote_or_print> 
     <message_version_number>3.7</message_version_number> 
     <submission_date>0001-04-12</submission_date> 
     <quote_response_status>Error</quote_response_status> 
     <quote_error_note> 
     <reason>[Error] Check if the User has access to the requested service</reason> 
     </quote_error_note> 
    </b_control> 
    </m_content> 
</message> 

код XSLT: Основываясь на значении переменной DataPower (вар: // сервис/сообщения об ошибке), Мне нужен ожидаемый результат.

<?xml version="1.0"?> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dp="http://www.datapower.com/extensions" version="1.0" extension-element-prefixes="dp" exclude-result-prefixes="dp"> 

<xsl:output method="xml" encoding="UTF-8"/> 

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

<xsl:template match="//*[contains(name(),'m_control')]"> 
    <xsl:choose> 
    <xsl:when test="dp:variable('var://service/error-message') = 'not present'"> 
     <m_control xmlns="http://www.origoservices.com"> 
     <xsl:apply-templates select="@* | *"/> 
     <message_status>User not recognized</message_status> 
     </m_control> 
    </xsl:when> 
    </xsl:choose> 
</xsl:template> 

<xsl:template match="//*[contains(name(),'b_control')]"> 
    <xsl:choose> 
    <xsl:when test="dp:variable('var://service/error-subcode')='0x01d30002'"> 
     <b_control xmlns="http://www.origoservices.com"> 
     <xsl:apply-templates select="@* | *"/> 
     <quote_response_status>Error</quote_response_status> 
     <quote_error_note> 
      <reason>[Error] Check if the User has access to the requested service</reason> 
     </quote_error_note> 
     </b_control> 
    </xsl:when> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 
+0

Пожалуйста, добавьте таблицы стилей XSLT на пост - чтобы доказать, что вы уже сделали попытку решить эту проблему самостоятельно. –

+0

Я добавил XSLT в вопрос. – user2607367

+0

Может ли кто-нибудь помочь мне в этом? – user2607367

ответ

0

Следующая таблица стилей соответствует вашим требованиям. Он выполняет общее преобразование идентичности (которое также делает ваш XSLT) с исключениями.

Обратите внимание, что я не принял во внимание любые изменения, которые выполняются вашей таблицей стилей, но не указаны в качестве требования (т. Е. Изменения quote_error_note и quote_response_status).

Эта линия:

<xsl:template match="text()[parent::ori:message_type]"> 

встречает свое первое требование, тот, который вы не смогли кода. Он соответствует текстовому содержимому message_type и выводит «Ответ».

Но это решение отличается от ваших по-другому: он делает не матч элементов вдоль линий:

<xsl:template match="//*[contains(name(),'m_control')]"> 

Скорее, их правильное пространство имен идентифицируется:

<xsl:template match="ori:m_control"> 

Теперь, какая разница? Ваш способ описания соответствия шаблона позволяет элементам использовать любое пространство имен. Это может быть не проблема в вашем случае (без противоречивых пространств имен), но это может быть вообще.

Полная таблица стилей

<?xml version="1.0" encoding="utf-8"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ori="http://www.origoservices.com" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
exclude-result-prefixes="ori xsi"> 

<xsl:output method="xml" indent="yes"/> 

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

<xsl:template match="ori:m_control"> 
    <xsl:copy> 
    <xsl:apply-templates/> 
    <message_status> 
     <xsl:text>User not allowed access</xsl:text> 
    </message_status> 
    </xsl:copy> 
</xsl:template> 


<xsl:template match="text()[parent::ori:message_type]"> 
    <xsl:text>Response</xsl:text> 
</xsl:template> 

</xsl:stylesheet> 
Смежные вопросы