XSLT 1.0连接元素

时间:2015-09-01 08:03:28

标签: xslt-1.0

我有一个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值,那么值需要连接

1 个答案:

答案 0 :(得分:0)

好的,这个模板应该符合您的需求:

<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>