XSLT 1.0连接元素(XSLT 1.0 to concatenate elements)

我有一个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(&quot;'&quot;,/ns0:RetrieveMIProcessRequest/ns0:ExternalRequestIDs[1]/ns0:ExternalRequestID,&quot;','&quot;,/ns0:RetrieveMIProcessRequest/ns0:ExternalRequestIDs[2]/ns0:ExternalRequestID&quot;'&quot;)"/> <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(&quot;'&quot;,/ns0:RetrieveMIProcessRequest/ns0:ExternalRequestIDs[1]/ns0:ExternalRequestID,&quot;','&quot;,/ns0:RetrieveMIProcessRequest/ns0:ExternalRequestIDs[2]/ns0:ExternalRequestID&quot;'&quot;)"/> <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培训"/>