我有以下输入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>
答案 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到输出的其他更改都是微不足道的。既然你明确指出:
我可以做基本的模板。
我会把它们留给你。