需要帮助使用XSLT进行XML到XML的转换

时间:2013-01-12 02:20:54

标签: xml xslt

我正在尝试使用xslt来读取输入xml的内容并生成输出xml。 我能够使用xslt生成输出xml,但无法将输入xml中的数据复制到生成的输出xml。现在我直接硬编码了xsl文件中的值。

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

需要帮助来修改xsl以读取元素&输入xml中的属性数据并将它们放在生成的输出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

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

`

1 个答案:

答案 0 :(得分: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>