2014-01-08 163 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_notequote_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>