使用XSLT使用多个名称空间标记移动XML

时间:2017-05-05 22:53:15

标签: xml xslt

我从一个程序接收XML并希望附加一个" Island"标记到顶部和底部,并将标记及其子标记移动到其父标记的底部。我的XML看起来像:

XML

<?xml version="1.0"?>
<IslandPolicyPeriodMessage xmlns="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.period.islandpolicyperiodmessagemodel" xmlns:accountid="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.account.accountidmodel" xmlns:address="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.addressmodel" xmlns:contact="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.contactmodel" xmlns:contactname="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.contactnamemodel" xmlns:coverage="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.coverage.coveragemodel" xmlns:covterm="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.coverage.covtermmodel" xmlns:covtermpattern="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.coverage.covtermpatternmodel" xmlns:form="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.formmodel" xmlns:formtextdata="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.formtextdatamodel" xmlns:gl7cost_gle="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.line.gl7.gl7cost_glemodel" xmlns:gl7coveragepart_gle="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.line.gl7.gl7coveragepart_glemodel" xmlns:gl7covrgpartcoverage_gle="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.line.gl7.gl7covrgpartcoverage_glemodel" xmlns:gl7exposure_gle="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.line.gl7.gl7exposure_glemodel" xmlns:gl7line_gle="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.line.gl7.gl7line_glemodel" xmlns:job="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.job.jobmodel" xmlns:organizationid="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.organizationidmodel" xmlns:policy="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.policymodel" xmlns:policyaddlinsured="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.policyaddlinsuredmodel" xmlns:policyaddlinsureddetail="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.policyaddlinsureddetailmodel" xmlns:policyaddress="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.policyaddressmodel" xmlns:policycontactrole="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.policycontactrolemodel" xmlns:policylocation="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.location.policylocationmodel" xmlns:policyperiod="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.period.policyperiodmodel" xmlns:policyterm="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.policytermmodel" xmlns:producercode="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.producercodemodel" xmlns:renewal="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.job.renewalmodel" xmlns:territorycode="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.general.territorycodemodel" xmlns:userroleassignment="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.userroleassignmentmodel" xmlns:uwcompanyid="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.uwcompanyidmodel">
<CertMail_Ext>false</CertMail_Ext>
<DirectMail_Ext>true</DirectMail_Ext>
<EventName>SendIssuance</EventName>
<ImageRightDocumentType_Ext>Renewal Declarations</ImageRightDocumentType_Ext>
<ImageRightFlowStepID_Ext>3176331764</ImageRightFlowStepID_Ext>
<ImageRightFolderType_Ext>Print Product</ImageRightFolderType_Ext>
<JobType>Renewal</JobType>
<MiscData xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<NonInferredFormCodes xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<PolicyPeriod>
    <policyperiod:NewlyAddedForms>
        <Form>
            <FormName>1</FormName>
        </Form>
        <Form>
            <FormName>2</FormName>
        </Form>
    </policyperiod:NewlyAddedForms>
    <Name>Test</Name>
</PolicyPeriod>
</IslandPolicyPeriodMessage>

XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:i="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.period.islandpolicyperiodmessagemodel" xmlns:accountid="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.account.accountidmodel" xmlns:address="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.addressmodel" xmlns:contact="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.contactmodel" xmlns:contactname="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.contactnamemodel" xmlns:coverage="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.coverage.coveragemodel" xmlns:covterm="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.coverage.covtermmodel" xmlns:covtermpattern="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.coverage.covtermpatternmodel" xmlns:form="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.formmodel" xmlns:formtextdata="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.formtextdatamodel" xmlns:gl7cost_gle="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.line.gl7.gl7cost_glemodel" xmlns:gl7coveragepart_gle="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.line.gl7.gl7coveragepart_glemodel" xmlns:gl7covrgpartcoverage_gle="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.line.gl7.gl7covrgpartcoverage_glemodel" xmlns:gl7exposure_gle="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.line.gl7.gl7exposure_glemodel" xmlns:gl7line_gle="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.line.gl7.gl7line_glemodel" xmlns:job="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.job.jobmodel" xmlns:organizationid="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.organizationidmodel" xmlns:policy="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.policymodel" xmlns:policyaddlinsured="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.policyaddlinsuredmodel" xmlns:policyaddlinsureddetail="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.policyaddlinsureddetailmodel" xmlns:policyaddress="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.policyaddressmodel" xmlns:policycontactrole="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.policycontactrolemodel" xmlns:policylocation="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.location.policylocationmodel" xmlns:policyperiod="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.period.policyperiodmodel" xmlns:policyterm="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.policytermmodel" xmlns:producercode="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.producercodemodel" xmlns:renewal="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.job.renewalmodel" xmlns:territorycode="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.general.territorycodemodel" xmlns:userroleassignment="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.userroleassignmentmodel" xmlns:uwcompanyid="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.uwcompanyidmodel">

<xsl:output encoding="UTF-8" indent="yes" method="xml" />

<!-- this is the identity transform: it copies everything that isn't matched by a more specific template -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

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

<xsl:template match="PolicyPeriod" >
    <xsl:copy>
        <xsl:apply-templates select="*[not(policyperiod:NewlyAddedForms)]" />
        <xsl:apply-templates select="policyperiod:NewlyAddedForms" />
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

输出

<?xml version="1.0" encoding="UTF-8"?>
<Island xmlns:i="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.period.islandpolicyperiodmessagemodel" xmlns:accountid="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.account.accountidmodel" xmlns:address="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.addressmodel" xmlns:contact="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.contactmodel" xmlns:contactname="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.contactnamemodel" xmlns:coverage="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.coverage.coveragemodel" xmlns:covterm="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.coverage.covtermmodel" xmlns:covtermpattern="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.coverage.covtermpatternmodel" xmlns:form="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.formmodel" xmlns:formtextdata="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.formtextdatamodel" xmlns:gl7cost_gle="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.line.gl7.gl7cost_glemodel" xmlns:gl7coveragepart_gle="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.line.gl7.gl7coveragepart_glemodel" xmlns:gl7covrgpartcoverage_gle="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.line.gl7.gl7covrgpartcoverage_glemodel" xmlns:gl7exposure_gle="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.line.gl7.gl7exposure_glemodel" xmlns:gl7line_gle="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.line.gl7.gl7line_glemodel" xmlns:job="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.job.jobmodel" xmlns:organizationid="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.organizationidmodel" xmlns:policy="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.policymodel" xmlns:policyaddlinsured="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.policyaddlinsuredmodel" xmlns:policyaddlinsureddetail="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.policyaddlinsureddetailmodel" xmlns:policyaddress="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.policyaddressmodel" xmlns:policycontactrole="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.policycontactrolemodel" xmlns:policylocation="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.location.policylocationmodel" xmlns:policyperiod="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.period.policyperiodmodel" xmlns:policyterm="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.policytermmodel" xmlns:producercode="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.producercodemodel" xmlns:renewal="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.job.renewalmodel" xmlns:territorycode="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.general.territorycodemodel" xmlns:userroleassignment="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.userroleassignmentmodel" xmlns:uwcompanyid="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.contact.uwcompanyidmodel">
  <IslandPolicyPeriodMessage xmlns="http://guidewire.com/pc/gx/islandinsurance.pc.gx.exstream.policy.period.islandpolicyperiodmessagemodel">
    <CertMail_Ext>false</CertMail_Ext>
    <DirectMail_Ext>true</DirectMail_Ext>
    <EventName>SendIssuance</EventName>
    <ImageRightDocumentType_Ext>Renewal Declarations</ImageRightDocumentType_Ext>
    <ImageRightFlowStepID_Ext>3176331764</ImageRightFlowStepID_Ext>
    <ImageRightFolderType_Ext>Print Product</ImageRightFolderType_Ext>
    <JobType>Renewal</JobType>
    <MiscData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    <NonInferredFormCodes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    <PolicyPeriod>
      <policyperiod:NewlyAddedForms>
        <Form>
          <FormName>1</FormName>
        </Form>
        <Form>
          <FormName>2</FormName>
        </Form>
      </policyperiod:NewlyAddedForms>
    <Name>Test</Name>
  </PolicyPeriod>
</IslandPolicyPeriodMessage>
</Island>

我的转型的第一部分可以运作,但是&#39; policyperiod:NewlyAddedForms&#39;没动。它应该是政策期&#39;

下的最后一个标记

谢谢!

1 个答案:

答案 0 :(得分:0)

PolicyPeriod从其父IslandPolicyPeriodMessage继承其命名空间。因此你的:

<xsl:template match="PolicyPeriod" >

与之不符。您需要将其更改为:

<xsl:template match="i:PolicyPeriod" >

此外,我相信你的意思是:

<xsl:apply-templates select="*[not(self::policyperiod:NewlyAddedForms)]" />

而不是:

<xsl:apply-templates select="*[not(policyperiod:NewlyAddedForms)]" />

另请注意,新添加的Island根元素位于无命名空间中,与其子IslandPolicyPeriodMessage不同。也许这就是想要的结果,但我认为值得你注意它。