根据子节点的条件和存在情况复制和过滤XML

时间:2019-10-31 18:13:22

标签: xslt xpath xslt-2.0

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

在下面的示例中,我只需要保留IsBusinness = Y的节点,并删除IsBusiness标签不存在的节点。

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

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

</CompanyTypes>

我尝试了以下代码,但是在IsBusiness不存在时无法删除父标记。

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

1 个答案:

答案 0 :(得分:1)

您所拥有的:

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

正在寻找一个名为IsBusiness的元素,其值不是"Y"。您的第三个Parent1节点没有这样的元素,因此该模板与之不匹配。

请尝试:

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