2014-09-18 116 views
0

我有以下輸入xml。我需要執行幾個步驟來獲得所需的輸出。我不熟悉XSLT。我可以做基本的模板。我被困在以下任務如何使用XSLT查找第二個子節點並更改節點名稱

我需要將<WorkCompPolicyQuoteInqRq>更改爲<WorkCompPolicyQuoteInqRs>。這裏的問題是標籤的名稱可能會有所不同,它可能是<XXXYRq> <AbCRq>但位置保持不變(InsuranceSvcRq的第二個孩子),最後兩個字符總是「Rq」。 我不知道如何做到這一點。我將不勝感激任何指導。謝謝!

輸入XML

<DATA> 
    <SignonRq> 
    </SignonRq> 
    <InsuranceSvcRq> 
     <RqUID>6D76AF16-56C0-4108-BD82-83985EDD6888</RqUID> 
     <WorkCompPolicyQuoteInqRq> 
     <RqUID>8CB1B8A1-83B2-4D94-8A9A-D5E801DD2E32</RqUID> 
     <TransactionRequestDt>2012-12-26T12:14:18</TransactionRequestDt> 
     <TransactionEffectiveDt>2012-10-01</TransactionEffectiveDt> 
     <CurCd>USD</CurCd> 
     </WorkCompPolicyQuoteInqRq> 
    </InsuranceSvcRq> 
</DATA> 

所需的輸出

<DATA> 
    <Status> 
     <StatusCd>0</StatusCd> 
     <StatusDesc>ACORD Success</StatusDesc> 
    </Status> 
    <InsuranceSvcRs> 
     <RqUID>6D76AF16-56C0-4108-BD82-83985EDD6888</RqUID> 
     <WorkCompPolicyQuoteInqRs> 
     <RqUID>8CB1B8A1-83B2-4D94-8A9A-D5E801DD2E32</RqUID> 
     <TransactionRequestDt>2012-12-26T12:14:18</TransactionRequestDt> 
     <TransactionEffectiveDt>2012-10-01</TransactionEffectiveDt> 
     <CurCd>USD</CurCd> 
     <MsgStatus> 
      <MsgStatusCd>Error</MsgStatusCd> 
      <MsgErrorCd>DataError</MsgErrorCd> 
      <MsgStatusDesc>Request Failed</MsgStatusDesc> 
      <ExtendedStatus> 
       <ExtendedStatusCd>DataInvalid</ExtendedStatusCd> 
       <ExtendedStatusDesc>Message</ExtendedStatusDesc> 
      </ExtendedStatus> 
     </MsgStatus> 
     </WorkCompPolicyQuoteInqRs> 
    </InsuranceSvcRs> 
</DATA> 
+0

如果所討論元素的名稱不同,那麼輸出新元素名稱的規則是什麼? – 2014-09-18 17:44:55

+0

規則是用s替換字符串中的最後一個字符q。例如,在上面的示例中,將被寫爲 Sganesan 2014-09-18 17:55:07

回答

1

位置準則(總是所述元件的InsuranceSvRq第二子)實際上是足以識別該元素。因此,您不必檢查名稱的最後一個字符是否爲「Rq」。

編寫的InsuranceSvcRq孩子相匹配的模板,如果它是在第二個位置:

<xsl:template match="InsuranceSvcRq/*[position() = 2]"> 

然後,引入新的元素,它的名字幾乎整個原始名稱的連接(無需任何潛在的命名空間前綴)保存爲最後一個字符 - 和「s」結尾。

<xsl:element name="{concat(substring(local-name(),1,string-length() -1),'s')}"> 

然後,應用模板的文檔的其餘部分或做其他事情:

 <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

您可能需要做的InsuranceSvcRq元素本身非常類似的東西。

從輸入XML到輸出的其餘更改都很簡單。既然你明確說明:

我可以做基本的模板。

我會把它們留給你。

+0

非常感謝! – Sganesan 2014-09-18 18:59:54