Copy and Filter XML based on a condition

2019-08-18 03:09发布

I am working on a XSLT which needs to copy the entire XML maintaining the same structure and filtering out some nodes based on a condition.

in the below example i need to keep only the nodes where IsBusinness = Y

<CompanyTypes>
  <Parent1>
    <ChildNode1>Test</ChildNode1>
    <ChildNode2>Test</ChildNode2>
    <CompanyType>
       <CompanyTypeID>1</CompanyTypeID>
       <CompanyTypeName>Individual</CompanyTypeName>
       <CompanyTypeDesc>Individual</CompanyTypeDesc>
        <IsBusiness>N</IsBusiness>
     </CompanyType>
  </Parent1>
  <Parent1>
    <ChildNode1>Test1</ChildNode1>
    <ChildNode2>Test</ChildNode2>
    <CompanyType>
       <CompanyTypeID>1</CompanyTypeID>
       <CompanyTypeName>Individual</CompanyTypeName>
       <CompanyTypeDesc>Individual</CompanyTypeDesc>
       <IsBusiness>Y</IsBusiness>
     </CompanyType>
  </Parent1>
  <Parent1>
    <ChildNode1>Test3</ChildNode1>
    <ChildNode2>Test9</ChildNode2>
    <CompanyType>
      <CompanyTypeID>1</CompanyTypeID>
      <CompanyTypeName>Individual</CompanyTypeName>
      <CompanyTypeDesc>Individual</CompanyTypeDesc>
      <IsBusiness>Y</IsBusiness>
    </CompanyType>
   </Parent1>
 </CompanyTypes>

desired output

<CompanyTypes>
<Parent1>
   <ChildNode1>Test1</ChildNode1>
   <ChildNode2>Test</ChildNode2>
   <CompanyType>
      <CompanyTypeID>1</CompanyTypeID>
      <CompanyTypeName>Individual</CompanyTypeName>
      <CompanyTypeDesc>Individual</CompanyTypeDesc>
      <IsBusiness>Y</IsBusiness>
   </CompanyType>
 </Parent1>
 <Parent1>
   <ChildNode1>Test3</ChildNode1>
   <ChildNode2>Test9</ChildNode2>
   <CompanyType>
      <CompanyTypeID>1</CompanyTypeID>
      <CompanyTypeName>Individual</CompanyTypeName>
      <CompanyTypeDesc>Individual</CompanyTypeDesc>
      <IsBusiness>Y</IsBusiness>
   </CompanyType>
 </Parent1>
</CompanyTypes>

标签: xml xslt
1条回答
在下西门庆
2楼-- · 2019-08-18 03:47

Use this

 <!-- Identical Template to copy all structure -->
    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>

    <!-- This template delete all CompanyType which node IsBusinness != Y -->    
    <xsl:template match="Parent1[CompanyType/IsBusiness != 'Y']"/>

See transform at https://xsltfiddle.liberty-development.net/gWvjQfV/1

Output

<CompanyTypes>
       <Parent1>
          <ChildNode1>Test1</ChildNode1>
          <ChildNode2>Test</ChildNode2>
          <CompanyType>
             <CompanyTypeID>1</CompanyTypeID>
             <CompanyTypeName>Individual</CompanyTypeName>
             <CompanyTypeDesc>Individual</CompanyTypeDesc>
             <IsBusiness>Y</IsBusiness>
          </CompanyType>
       </Parent1>
       <Parent1>
          <ChildNode1>Test3</ChildNode1>
          <ChildNode2>Test9</ChildNode2>
          <CompanyType>
             <CompanyTypeID>1</CompanyTypeID>
             <CompanyTypeName>Individual</CompanyTypeName>
             <CompanyTypeDesc>Individual</CompanyTypeDesc>
             <IsBusiness>Y</IsBusiness>
          </CompanyType>
       </Parent1>
    </CompanyTypes>
查看更多
登录 后发表回答