我有一个XML,它有一个名为ExternalRequestIDs的复杂元素,我的要求是连接运行时出现的ExternalRequestID值。 如果输入具有5个ExternalRequestID值,则需要连接5个值。 我创建的XSL只执行静态转换,我试图在xslt 1.0中完成这个逻辑,我是xslt的新手请帮忙
源XML -
<?xml version="1.0" encoding="UTF-8" ?> <RetrieveMIProcessRequest xmlns="http://xmlns.mycompany.com/RetrieveMI"> <ExternalRequestIDs> <ExternalRequestID>ID1</ExternalRequestID> </ExternalRequestIDs> <ExternalRequestIDs> <ExternalRequestID>ID2</ExternalRequestID> </ExternalRequestIDs> <ExternalRequestIDs> <ExternalRequestID>ID3</ExternalRequestID> </ExternalRequestIDs> <SourceSystem>SourceSystemName</SourceSystem> </RetrieveMIProcessRequest>转换创建为连接ExternalRequestID值 -
<xsl:template match="/"> <ns0:RetrieveMIProcessRequest> <xsl:for-each select="/ns0:RetrieveMIProcessRequest/ns0:ExternalRequestIDs"> <xsl:variable name="ExtId" select="concat("'",/ns0:RetrieveMIProcessRequest/ns0:ExternalRequestIDs[1]/ns0:ExternalRequestID,"','",/ns0:RetrieveMIProcessRequest/ns0:ExternalRequestIDs[2]/ns0:ExternalRequestID"'")"/> <ns0:ExternalRequestIDs> <ns0:ExternalRequestID> <xsl:value-of select="$ExtId"/> </ns0:ExternalRequestID> </ns0:ExternalRequestIDs> </xsl:for-each> <ns0:SourceSystem> <xsl:value-of select="/ns0:RetrieveMIProcessRequest/ns0:SourceSystem"/> </ns0:SourceSystem> </ns0:RetrieveMIProcessRequest> </xsl:template>转型后的产出 -
<?xml version = '1.0' encoding = 'UTF-8'?> <ns0:RetrieveMIProcessRequest xmlns:ns0="http://xmlns.mycompany.com/RetrieveMI"> <ns0:ExternalRequestIDs> <ns0:ExternalRequestID>'ID1','ID2'</ns0:ExternalRequestID> </ns0:ExternalRequestIDs> <ns0:ExternalRequestIDs> <ns0:ExternalRequestID>'ID1','ID2'</ns0:ExternalRequestID> </ns0:ExternalRequestIDs> <ns0:ExternalRequestIDs> <ns0:ExternalRequestID>'ID1','ID2'</ns0:ExternalRequestID> </ns0:ExternalRequestIDs> <ns0:SourceSystem>SourceSystemName</ns0:SourceSystem> </ns0:RetrieveMIProcessRequest>预期产出 -
<?xml version = '1.0' encoding = 'UTF-8'?> <ns0:RetrieveMIProcessRequest xmlns:ns0="http://xmlns.mycompany.com/RetrieveMI"> <ns0:ExternalRequestIDs> <ns0:ExternalRequestID>'ID1','ID2','ID3'</ns0:ExternalRequestID> </ns0:ExternalRequestIDs> <ns0:SourceSystem>SourceSystemName</ns0:SourceSystem> </ns0:RetrieveMIProcessRequest>这需要在运行时根据输入请求中的ExternalRequestID值来实现。 如果输入具有5个ExternalRequestID值,则需要连接值
I have a XML which has complex element called ExternalRequestIDs, My requirement is to concatenate the ExternalRequestID values coming at run time. If the input has 5 ExternalRequestID values then the 5 values needs to be concatenated. The XSL i have created perform only static translation, am trying to accomplish this logic in xslt 1.0, i am new to xslt Please help
Source XML -
<?xml version="1.0" encoding="UTF-8" ?> <RetrieveMIProcessRequest xmlns="http://xmlns.mycompany.com/RetrieveMI"> <ExternalRequestIDs> <ExternalRequestID>ID1</ExternalRequestID> </ExternalRequestIDs> <ExternalRequestIDs> <ExternalRequestID>ID2</ExternalRequestID> </ExternalRequestIDs> <ExternalRequestIDs> <ExternalRequestID>ID3</ExternalRequestID> </ExternalRequestIDs> <SourceSystem>SourceSystemName</SourceSystem> </RetrieveMIProcessRequest>Transformation Created to Concatenate ExternalRequestID values -
<xsl:template match="/"> <ns0:RetrieveMIProcessRequest> <xsl:for-each select="/ns0:RetrieveMIProcessRequest/ns0:ExternalRequestIDs"> <xsl:variable name="ExtId" select="concat("'",/ns0:RetrieveMIProcessRequest/ns0:ExternalRequestIDs[1]/ns0:ExternalRequestID,"','",/ns0:RetrieveMIProcessRequest/ns0:ExternalRequestIDs[2]/ns0:ExternalRequestID"'")"/> <ns0:ExternalRequestIDs> <ns0:ExternalRequestID> <xsl:value-of select="$ExtId"/> </ns0:ExternalRequestID> </ns0:ExternalRequestIDs> </xsl:for-each> <ns0:SourceSystem> <xsl:value-of select="/ns0:RetrieveMIProcessRequest/ns0:SourceSystem"/> </ns0:SourceSystem> </ns0:RetrieveMIProcessRequest> </xsl:template>Output after transformation -
<?xml version = '1.0' encoding = 'UTF-8'?> <ns0:RetrieveMIProcessRequest xmlns:ns0="http://xmlns.mycompany.com/RetrieveMI"> <ns0:ExternalRequestIDs> <ns0:ExternalRequestID>'ID1','ID2'</ns0:ExternalRequestID> </ns0:ExternalRequestIDs> <ns0:ExternalRequestIDs> <ns0:ExternalRequestID>'ID1','ID2'</ns0:ExternalRequestID> </ns0:ExternalRequestIDs> <ns0:ExternalRequestIDs> <ns0:ExternalRequestID>'ID1','ID2'</ns0:ExternalRequestID> </ns0:ExternalRequestIDs> <ns0:SourceSystem>SourceSystemName</ns0:SourceSystem> </ns0:RetrieveMIProcessRequest>Expected Output -
<?xml version = '1.0' encoding = 'UTF-8'?> <ns0:RetrieveMIProcessRequest xmlns:ns0="http://xmlns.mycompany.com/RetrieveMI"> <ns0:ExternalRequestIDs> <ns0:ExternalRequestID>'ID1','ID2','ID3'</ns0:ExternalRequestID> </ns0:ExternalRequestIDs> <ns0:SourceSystem>SourceSystemName</ns0:SourceSystem> </ns0:RetrieveMIProcessRequest>This needs to be achieved at run based on the ExternalRequestID values coming in the input request. If the input has 5 ExternalRequestID values then the values needs to be concatenated
最满意答案
好的,这个模板应该符合您的需求:
<xsl:template match="/"> <ns0:RetrieveMIProcessRequest> <ns0:ExternalRequestIDs> <ns0:ExternalRequestID> <!-- Loop on all ExternalRequestID and concatenate the textual values --> <xsl:for-each select="/ns0:RetrieveMIProcessRequest/ns0:ExternalRequestIDs/ns0:ExternalRequestID"> <xsl:text>'</xsl:text> <xsl:value-of select="."/> <xsl:text>'</xsl:text> <xsl:if test="following::ns0:ExternalRequestID"> <xsl:text>,</xsl:text> </xsl:if> </xsl:for-each> </ns0:ExternalRequestID> </ns0:ExternalRequestIDs> <ns0:SourceSystem> <xsl:value-of select="/ns0:RetrieveMIProcessRequest/ns0:SourceSystem"/> </ns0:SourceSystem> </ns0:RetrieveMIProcessRequest> </xsl:template>我得到的输出是:
<?xml version="1.0" encoding="UTF-8"?> <ns0:RetrieveMIProcessRequest xmlns:ns0="http://xmlns.mycompany.com/RetrieveMI"> <ns0:ExternalRequestIDs> <ns0:ExternalRequestID>'ID1','ID2','ID3'</ns0:ExternalRequestID> </ns0:ExternalRequestIDs> <ns0:SourceSystem>SourceSystemName</ns0:SourceSystem> </ns0:RetrieveMIProcessRequest>OK, this template should fit your needs :
<xsl:template match="/"> <ns0:RetrieveMIProcessRequest> <ns0:ExternalRequestIDs> <ns0:ExternalRequestID> <!-- Loop on all ExternalRequestID and concatenate the textual values --> <xsl:for-each select="/ns0:RetrieveMIProcessRequest/ns0:ExternalRequestIDs/ns0:ExternalRequestID"> <xsl:text>'</xsl:text> <xsl:value-of select="."/> <xsl:text>'</xsl:text> <xsl:if test="following::ns0:ExternalRequestID"> <xsl:text>,</xsl:text> </xsl:if> </xsl:for-each> </ns0:ExternalRequestID> </ns0:ExternalRequestIDs> <ns0:SourceSystem> <xsl:value-of select="/ns0:RetrieveMIProcessRequest/ns0:SourceSystem"/> </ns0:SourceSystem> </ns0:RetrieveMIProcessRequest> </xsl:template>The output I get is:
<?xml version="1.0" encoding="UTF-8"?> <ns0:RetrieveMIProcessRequest xmlns:ns0="http://xmlns.mycompany.com/RetrieveMI"> <ns0:ExternalRequestIDs> <ns0:ExternalRequestID>'ID1','ID2','ID3'</ns0:ExternalRequestID> </ns0:ExternalRequestIDs> <ns0:SourceSystem>SourceSystemName</ns0:SourceSystem> </ns0:RetrieveMIProcessRequest>更多推荐
ns,ExternalRequestID,RetrieveMIProcessRequest>,电脑培训,计算机培训,IT培训"/>
发布评论