如何使用XSLT查找第二个子节点并更改节点名称

时间:2014-09-18 17:22:56

标签: xml xslt

我有以下输入xml。我需要做几个步骤来获得理想的输出。我不熟悉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>

1 个答案:

答案 0 :(得分:1)

位置标准(所述元素始终是InsuranceSvRq的第二个子元素)实际上足以识别此元素。因此,您不必检查名称的最后一个字符是否为&#34; Rq&#34;。

编写一个匹配InsuranceSvcRq子项的模板(如果它位于第二个位置:

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

然后,引入一个新元素,其名称几乎是整个原始名称的连接(没有任何潜在的名称空间前缀)保存为最后一个字符 - &#34; s&#34;最后。

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

然后,将模板应用于文档的其余部分或执行其他操作:

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

您可能希望使用InsuranceSvcRq元素本身执行非常类似的操作。

从输入XML到输出的其他更改都是微不足道的。既然你明确指出:

  

我可以做基本的模板。

我会把它们留给你。