2013-01-12 102 views
-1

我想使用xslt读取输入xml的内容并生成输出xml。 我能够使用xslt生成输出xml,但无法将输入xml中的数据复制到生成的输出xml。现在我直接硬编码了xsl文件中的值。需要帮助使用XSLT进行XML到XML转换

下面是输入xml和预期输出xml以及XSL。

需要帮助来修改在xsl从输入XML读取元件&属性数据,并把它们在corrosponding所生成的输出XML

输入XML

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<soapenv:Body> 
<ns0:Envelope xmlns:ns0="urn:test.com:xi:testsoap2soap"> 
<Header> 
    <m_Header mustUnderstand="0"> 
    <m_SessionID>SessionID1</m_SessionID> 
    </m_Header> 
</Header> 
<Body> 
    <Generate> 
    <iPolicyID>473441</iPolicyID> 
    <sNoticeTypeID>C</sNoticeTypeID> 
    <iAdvDays>0</iAdvDays> 
    <PolicyQuestions arrayType="npts:wspPolicyQuestion[0]" nil="true" offset="[0]" type="SOAP-ENC:Array"> 
     <wspPolicyQuestion> 
      <iQuestionID/> 
      <mQuestion/> 
      <sStateID/> 
      <mAnswer/> 
      <BasePolicyType/> 
      <SysPolicyType/> 
     </wspPolicyQuestion> 
    </PolicyQuestions> 
    <sReasonID>myReason</sReasonID> 
    <mReasonText>myreasontext</mReasonText> 
    <Agencies arrayType="npts:wspAgency[0]" nil="true" offset="[0]" type="SOAP-ENC:Array"> 
     <wspAgency> 
      <iAgencyID/> 
      <Address/> 
      <sName1/> 
      <sAgen800/> 
      <sAgencyRefNbr/> 
     </wspAgency> 
    </Agencies> 
    <iUnderwriterID>0</iUnderwriterID> 
    <iFaxID>7284</iFaxID> 
    <PopupQuestions arrayType="npts:wspPopupQuestion[0]" nil="true" offset="[0]" type="SOAP-ENC:Array"> 
     <wspPopupQuestion> 
      <iPopUpID/> 
      <mText/> 
      <cVarType/> 
      <sVarLen/> 
      <sReasonID/> 
      <mAnswer/> 
      <ISNID/> 
      <BasePolicyType/> 
     </wspPopupQuestion> 
    </PopupQuestions> 
    <ExtraNotices arrayType="npts:wspExtraNotice[0]" nil="true" offset="[0]" type="SOAP-ENC:Array"> 
     <wspExtraNotice> 
      <iExtraNoticeID/> 
      <iAddressID/> 
      <sName1/> 
      <sName2/> 
      <mText/> 
     </wspExtraNotice> 
    </ExtraNotices> 
    <dtMail>2013-01-08</dtMail> 
    <iMailLeadDays>0</iMailLeadDays> 
    <dtEffective>2013-01-25</dtEffective> 
    <iMailingTypeID>77</iMailingTypeID> 
    <bDateAutoCalc>false</bDateAutoCalc> 
    <sAsOfPhrase/> 
    <sFreeformTitle/> 
    <mFreeformText/> 
    <FreeformReceipients>0</FreeformReceipients> 
    <RemittanceSlip arrayType="npts:wspRemittanceSlip[5]" nil="true" offset="[0]" type="SOAP-ENC:Array"> 
     <wspRemittanceSlip> 
      <FieldName>DocType</FieldName> 
      <FieldValue>7</FieldValue> 
     </wspRemittanceSlip> 
     <wspRemittanceSlip> 
      <FieldName>ScanLine</FieldName> 
      <FieldValue>027 0018949170X013091774 01012013 7 00000002559600 1</FieldValue> 
     </wspRemittanceSlip> 
     <wspRemittanceSlip> 
      <FieldName>BPNumber</FieldName> 
      <FieldValue>1009738961</FieldValue> 
     </wspRemittanceSlip> 
     <wspRemittanceSlip> 
      <FieldName>RefNumber</FieldName> 
      <FieldValue>00018949170X01309177</FieldValue> 
     </wspRemittanceSlip> 
     <wspRemittanceSlip> 
      <FieldName>CouponName</FieldName> 
      <FieldValue>ABC Company</FieldValue> 
     </wspRemittanceSlip> 
    </RemittanceSlip> 
    <sRemittanceSlipLayout>remit_slip_bpr.txt</sRemittanceSlipLayout> 
    <sRemittanceSlipTemplate>remit_slip_bpr.pdf</sRemittanceSlipTemplate> 
    <PrintAction>32</PrintAction> 
    <CopyOptions>0</CopyOptions> 
    <CCListOptions>0</CCListOptions> 
    </Generate> 
</Body> 
</ns0:Envelope> 
</soapenv:Body> 
</soapenv:Envelope> 

输出XML的elemwnts /属性

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
<SOAP-ENV:Header> 
    <npts:m_Header xmlns:npts="urn:TestService" SOAP-ENV:mustUnderstand="0"> 
     <m_SessionID>SESSIONID1</m_SessionID> 
    </npts:m_Header> 
</SOAP-ENV:Header> 
<SOAP-ENV:Body> 
    <npts:Generate xmlns:npts="urn:TestService"> 
     <iPolicyID>473441</iPolicyID> 
     <sNoticeTypeID>C</sNoticeTypeID> 
     <iAdvDays>0</iAdvDays> 
     <npts:PolicyQuestions xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-SCH="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENC:arrayType="npts:wspPolicyQuestion[0]" SOAP-SCH:nil="true" SOAP-ENC:offset="[0]" SOAP-SCH:type="SOAP-ENC:Array"/> 
     <sReasonID>myreason</sReasonID> 
     <mReasonText>myreasontext</mReasonText> 
     <npts:Agencies xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-SCH="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENC:arrayType="npts:wspAgency[0]" SOAP-SCH:nil="true" SOAP-ENC:offset="[0]" SOAP-SCH:type="SOAP-ENC:Array"/> 
     <iUnderwriterID>0</iUnderwriterID> 
     <iFaxID>728477</iFaxID> 
     <npts:PopupQuestions xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-SCH="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENC:arrayType="npts:wspPopupQuestion[0]" SOAP-SCH:nil="true" SOAP-ENC:offset="[0]" SOAP-SCH:type="SOAP-ENC:Array"/> 
     <npts:ExtraNotices xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-SCH="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENC:arrayType="npts:wspExtraNotice[0]" SOAP-SCH:nil="true" SOAP-ENC:offset="[0]" SOAP-SCH:type="SOAP-ENC:Array"/> 
     <dtMail>2013-01-08</dtMail> 
     <iMailLeadDays>0</iMailLeadDays> 
     <dtEffective>2013-01-25</dtEffective> 
     <iMailingTypeID>77</iMailingTypeID> 
     <bDateAutoCalc>false</bDateAutoCalc> 
     <sAsOfPhrase/> 
     <sFreeformTitle/> 
     <mFreeformText/> 
     <FreeformReceipients>0</FreeformReceipients> 
     <npts:RemittanceSlip xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-SCH="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENC:arrayType="npts:wspRemittanceSlip[5]" SOAP-ENC:offset="[0]" SOAP-SCH:type="SOAP-ENC:Array"> 
      <wspRemittanceSlip> 
       <FieldName>DocType</FieldName> 
       <FieldValue>7</FieldValue> 
      </wspRemittanceSlip> 
      <wspRemittanceSlip> 
       <FieldName>ScanLine</FieldName> 
       <FieldValue>027 0018949170X013091774 01012013 7 00000002559600 1</FieldValue> 
      </wspRemittanceSlip> 
      <wspRemittanceSlip> 
       <FieldName>BPNumber</FieldName> 
       <FieldValue>1009738961</FieldValue> 
      </wspRemittanceSlip> 
      <wspRemittanceSlip> 
       <FieldName>RefNumber</FieldName> 
       <FieldValue>00018949170X01309177</FieldValue> 
      </wspRemittanceSlip> 
      <wspRemittanceSlip> 
       <FieldName>CouponName</FieldName> 
       <FieldValue>ABC Company</FieldValue> 
      </wspRemittanceSlip> 
     </npts:RemittanceSlip> 
     <sRemittanceSlipLayout>remit_slip_bpr.txt</sRemittanceSlipLayout> 
     <sRemittanceSlipTemplate>remit_slip_bpr.pdf</sRemittanceSlipTemplate> 
     <PrintAction>32</PrintAction> 
     <CopyOptions>0</CopyOptions> 
     <CCListOptions>0</CCListOptions> 
    </npts:Generate> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

XSL用来获取XML输出

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
          xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope" 
          xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
          xmlns:npts="urn:TestService" 
          xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
          xmlns:SOAP-SCH="http://www.w3.org/2001/XMLSchema-instance" 
          xmlns:ns0="urn:test.com:xi:testsoap2soap"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
<xsl:element name="SOAP-ENV:Envelope"> 
<xsl:element name="SOAP-ENV:Header"> 
<xsl:element name="npts:m_Header"> 
<xsl:attribute name="SOAP-ENV:mustUnderstand"><xsl:value-of select="m_Header/@mustUnderstand"/></xsl:attribute> 
<xsl:element name="m_SessionID">SESSIONID1</xsl:element> 
</xsl:element> 
</xsl:element> 
<xsl:element name="SOAP-ENV:Body"> 
<xsl:element name="npts:Generate"> 
<xsl:element name="iPolicyID">473441</xsl:element> 
<xsl:element name="sNoticeTypeID">C</xsl:element> 
<xsl:element name="iAdvDays">0</xsl:element> 
<xsl:element name="npts:PolicyQuestions"> 
<xsl:attribute name="SOAP-ENC:arrayType">npts:wspPolicyQuestion[0]</xsl:attribute> 
<xsl:attribute name="SOAP-SCH:nil">true</xsl:attribute> 
<xsl:attribute name="SOAP-ENC:offset">[0]</xsl:attribute> 
<xsl:attribute name="SOAP-SCH:type">SOAP-ENC:Array</xsl:attribute> 
</xsl:element> 
<xsl:element name="sReasonID">myreason</xsl:element> 
<xsl:element name="mReasonText">myreasontext</xsl:element> 
<xsl:element name="npts:Agencies"> 
<xsl:attribute name="SOAP-ENC:arrayType">npts:wspAgency[0]</xsl:attribute> 
<xsl:attribute name="SOAP-SCH:nil">true</xsl:attribute> 
<xsl:attribute name="SOAP-ENC:offset">[0]</xsl:attribute> 
<xsl:attribute name="SOAP-SCH:type">SOAP-ENC:Array</xsl:attribute> 
</xsl:element> 
<xsl:element name="iUnderwriterID">0</xsl:element> 
<xsl:element name="iFaxID">728477</xsl:element> 
<xsl:element name="npts:PopupQuestions"> 
<xsl:attribute name="SOAP-ENC:arrayType">npts:wspPopupQuestion[0]</xsl:attribute> 
<xsl:attribute name="SOAP-SCH:nil">true</xsl:attribute> 
<xsl:attribute name="SOAP-ENC:offset">[0]</xsl:attribute> 
<xsl:attribute name="SOAP-SCH:type">SOAP-ENC:Array</xsl:attribute> 
</xsl:element> 
<xsl:element name="npts:ExtraNotices"> 
<xsl:attribute name="SOAP-ENC:arrayType">npts:wspExtraNotice[0]</xsl:attribute> 
<xsl:attribute name="SOAP-SCH:nil">true</xsl:attribute> 
<xsl:attribute name="SOAP-ENC:offset">[0]</xsl:attribute> 
<xsl:attribute name="SOAP-SCH:type">SOAP-ENC:Array</xsl:attribute> 
</xsl:element> 
<xsl:element name="dtMail">2013-01-08</xsl:element> 
<xsl:element name="iMailLeadDays">0</xsl:element> 
<xsl:element name="dtEffective">2013-01-25</xsl:element> 
<xsl:element name="iMailingTypeID">77</xsl:element> 
<xsl:element name="bDateAutoCalc">false</xsl:element> 
<xsl:element name="sAsOfPhrase"></xsl:element> 
<xsl:element name="sFreeformTitle"></xsl:element> 
<xsl:element name="mFreeformText"></xsl:element> 
<xsl:element name="FreeformReceipients">0</xsl:element> 
<xsl:element name="npts:RemittanceSlip"> 
<xsl:attribute name="SOAP-ENC:arrayType">npts:wspRemittanceSlip[5]</xsl:attribute> 
<xsl:attribute name="SOAP-ENC:offset">[0]</xsl:attribute> 
<xsl:attribute name="SOAP-SCH:type">SOAP-ENC:Array</xsl:attribute> 
<xsl:element name="wspRemittanceSlip"> 
<xsl:element name="FieldName">DocType</xsl:element> 
<xsl:element name="FieldValue">7</xsl:element> 
</xsl:element> 
<xsl:element name="wspRemittanceSlip"> 
<xsl:element name="FieldName">ScanLine</xsl:element> 
<xsl:element name="FieldValue">027 0018949170X013091774 01012013 7 00000002559600 1</xsl:element> 
</xsl:element> 
<xsl:element name="wspRemittanceSlip"> 
<xsl:element name="FieldName">BPNumber</xsl:element> 
<xsl:element name="FieldValue">1009738961</xsl:element> 
</xsl:element> 
<xsl:element name="wspRemittanceSlip"> 
<xsl:element name="FieldName">RefNumber</xsl:element> 
<xsl:element name="FieldValue">00018949170X01309177</xsl:element> 
</xsl:element> 
<xsl:element name="wspRemittanceSlip"> 
<xsl:element name="FieldName">CouponName</xsl:element> 
<xsl:element name="FieldValue">ABC Company</xsl:element> 
</xsl:element> 
</xsl:element> 
<xsl:element name="sRemittanceSlipLayout">remit_slip_bpr.txt</xsl:element> 
<xsl:element name="sRemittanceSlipTemplate">remit_slip_bpr.pdf</xsl:element> 
<xsl:element name="PrintAction">32</xsl:element> 
<xsl:element name="CopyOptions">0</xsl:element> 
<xsl:element name="CCListOptions">0</xsl:element> 
</xsl:element> 
</xsl:element> 
</xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

`

+0

你真的想从'soapenv'命名空间前缀改为'SOAP-ENV'? –

回答

1

,而不是一个模板匹配“/”和手动创建的输出,使用identity transform,然后只覆盖你需要什么。另外,除非您要动态创建名称/前缀,否则您将不需要使用xsl:element/xsl:attribute,以供将来参考。大多数情况下,您可以直接将元素/属性写入样式表中。

有太多的分析,试图找出你的输入/输出之间的差异,所以这里是一个例子,应该让你通过npts:Generate。以此为基础,您应该可以自行完成。如果遇到问题,请回过头来回答一些具体问题,我相信有人会提供帮助。

XSLT 1.0

<xsl:stylesheet version="1.0" 
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:ns0="urn:test.com:xi:testsoap2soap" 
    xmlns:npts="urn:TestService" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="soapenv:*"> 
     <xsl:element name="SOAP-ENV:{local-name()}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="*[namespace-uri()='']"> 
     <xsl:element name="{name()}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="soapenv:Envelope|soapenv:Body"> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="ns0:Envelope"> 
     <xsl:element name="SOAP-ENV:{local-name()}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="Header|Body" priority="1"> 
     <xsl:element name="SOAP-ENV:{local-name()}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="m_Header|Generate" priority="1"> 
     <xsl:element name="npts:{local-name()}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="m_Header/@mustUnderstand"> 
     <xsl:attribute name="SOAP-ENV:mustUnderstand"> 
      <xsl:value-of select="."/> 
     </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

输出(通过ntps:Generate

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header> 
     <npts:m_Header xmlns:npts="urn:TestService" SOAP-ENV:mustUnderstand="0"> 
      <m_SessionID>SessionID1</m_SessionID> 
     </npts:m_Header> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body> 
     <npts:Generate xmlns:npts="urn:TestService"> 
      <!--Any decendants from this point 
      are unchanged.--> 
      <iPolicyID>473441</iPolicyID> 
      <sNoticeTypeID>C</sNoticeTypeID> 
      <iAdvDays>0</iAdvDays> 
      <PolicyQuestions arrayType="npts:wspPolicyQuestion[0]" 
       nil="true" 
       offset="[0]" 
       type="SOAP-ENC:Array"> 
       <wspPolicyQuestion> 
        <iQuestionID/> 
        <mQuestion/> 
        <sStateID/> 
        <mAnswer/> 
        <BasePolicyType/> 
        <SysPolicyType/> 
       </wspPolicyQuestion> 
      </PolicyQuestions> 
      <sReasonID>myReason</sReasonID> 
      <mReasonText>myreasontext</mReasonText> 
      <Agencies arrayType="npts:wspAgency[0]" 
       nil="true" 
       offset="[0]" 
       type="SOAP-ENC:Array"> 
       <wspAgency> 
        <iAgencyID/> 
        <Address/> 
        <sName1/> 
        <sAgen800/> 
        <sAgencyRefNbr/> 
       </wspAgency> 
      </Agencies> 
      <iUnderwriterID>0</iUnderwriterID> 
      <iFaxID>7284</iFaxID> 
      <PopupQuestions arrayType="npts:wspPopupQuestion[0]" 
       nil="true" 
       offset="[0]" 
       type="SOAP-ENC:Array"> 
       <wspPopupQuestion> 
        <iPopUpID/> 
        <mText/> 
        <cVarType/> 
        <sVarLen/> 
        <sReasonID/> 
        <mAnswer/> 
        <ISNID/> 
        <BasePolicyType/> 
       </wspPopupQuestion> 
      </PopupQuestions> 
      <ExtraNotices arrayType="npts:wspExtraNotice[0]" 
       nil="true" 
       offset="[0]" 
       type="SOAP-ENC:Array"> 
       <wspExtraNotice> 
        <iExtraNoticeID/> 
        <iAddressID/> 
        <sName1/> 
        <sName2/> 
        <mText/> 
       </wspExtraNotice> 
      </ExtraNotices> 
      <dtMail>2013-01-08</dtMail> 
      <iMailLeadDays>0</iMailLeadDays> 
      <dtEffective>2013-01-25</dtEffective> 
      <iMailingTypeID>77</iMailingTypeID> 
      <bDateAutoCalc>false</bDateAutoCalc> 
      <sAsOfPhrase/> 
      <sFreeformTitle/> 
      <mFreeformText/> 
      <FreeformReceipients>0</FreeformReceipients> 
      <RemittanceSlip arrayType="npts:wspRemittanceSlip[5]" 
       nil="true" 
       offset="[0]" 
       type="SOAP-ENC:Array"> 
       <wspRemittanceSlip> 
        <FieldName>DocType</FieldName> 
        <FieldValue>7</FieldValue> 
       </wspRemittanceSlip> 
       <wspRemittanceSlip> 
        <FieldName>ScanLine</FieldName> 
        <FieldValue>027 0018949170X013091774 01012013 7 00000002559600 1</FieldValue> 
       </wspRemittanceSlip> 
       <wspRemittanceSlip> 
        <FieldName>BPNumber</FieldName> 
        <FieldValue>1009738961</FieldValue> 
       </wspRemittanceSlip> 
       <wspRemittanceSlip> 
        <FieldName>RefNumber</FieldName> 
        <FieldValue>00018949170X01309177</FieldValue> 
       </wspRemittanceSlip> 
       <wspRemittanceSlip> 
        <FieldName>CouponName</FieldName> 
        <FieldValue>ABC Company</FieldValue> 
       </wspRemittanceSlip> 
      </RemittanceSlip> 
      <sRemittanceSlipLayout>remit_slip_bpr.txt</sRemittanceSlipLayout> 
      <sRemittanceSlipTemplate>remit_slip_bpr.pdf</sRemittanceSlipTemplate> 
      <PrintAction>32</PrintAction> 
      <CopyOptions>0</CopyOptions> 
      <CCListOptions>0</CCListOptions> 
     </npts:Generate> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
+0

感谢丹尼尔,将进一步处理您提供的意见,并在出现任何问题时回到论坛。 – user1971595