根据条件复制和过滤XML,并使用XSLT删除父节点

时间:2019-06-18 06:27:27

标签: xml xslt

我正在研究一个XSLT,它需要复制保持相同结构的整个XML,并根据条件过滤掉某些节点。

在下面的示例中,我只需要保留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>

所需的输出

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

3 个答案:

答案 0 :(得分:0)

要省略除包含Parent1 =='Y'以外的IsBusiness个元素, 您需要为此类元素包括一个空模板

<xsl:template match="Parent1[not(CompanyType/IsBusiness = 'Y')]"/>

当然,脚本还应该包含身份模板

因此整个脚本如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="Parent1[not(CompanyType/IsBusiness = 'Y')]"/>

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

答案 1 :(得分:0)

检查此代码:-

<xsl:template match="node() | @*">
    <xsl:copy><xsl:apply-templates select="node() | @*"/></xsl:copy>
</xsl:template>
  <xsl:template match="Parent1/CompanyType[IsBusiness != 'Y']"/>

答案 2 :(得分:0)

这就是您需要的。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeAsync",
                "lambda:InvokeFunction",
                "lambda:UpdateFunctionCode",
                "lambda:UpdateFunctionConfiguration"
            ],
            "Resource": "arn:aws:lambda:ap-southeast-2:123456789012:function:my-function"
        }
    ]
}