使用基于子节点的 XSLT 过滤 XML

Filter XML using XSLT based on a child Node

我有下面的 XML,我想使用 XSLT 过滤 XML 以根据 IsBusiness

分离 CompanyType
   <CompanyTypes>
            <CompanyType>
               <CompanyTypeID>1</CompanyTypeID>
               <CompanyTypeName>Individual</CompanyTypeName>
               <CompanyTypeDesc>Individual</CompanyTypeDesc>
               <IsBusiness>N</IsBusiness>
            </CompanyType>
            <CompanyType>
               <CompanyTypeID>2</CompanyTypeID>
               <CompanyTypeName>Proprietorship</CompanyTypeName>
               <CompanyTypeDesc>Proprietorship</CompanyTypeDesc>
               <IsBusiness>N</IsBusiness>
            </CompanyType>
            <CompanyType>
               <CompanyTypeID>3</CompanyTypeID>
               <CompanyTypeName>Trust Irrevocable</CompanyTypeName>
               <CompanyTypeDesc>Irrevocable Trust</CompanyTypeDesc>
               <IsBusiness>N</IsBusiness>
            </CompanyType>
            <CompanyType>
               <CompanyTypeID>4</CompanyTypeID>
               <CompanyTypeName>Trust Revocable</CompanyTypeName>
               <CompanyTypeDesc>Revocable Trust</CompanyTypeDesc>
               <IsBusiness>N</IsBusiness>
            </CompanyType>
            <CompanyType>
               <CompanyTypeID>5</CompanyTypeID>
               <CompanyTypeName>Association</CompanyTypeName>
               <CompanyTypeDesc>Association</CompanyTypeDesc>
               <IsBusiness>Y</IsBusiness>
            </CompanyType>
          </CompanyTypes>

我想获取

中的所有 IsBusiness = N
<CompanyTypesIndividual>
  <CompanyType>
   <CompanyTypeID>3</CompanyTypeID>
   <CompanyTypeName>Trust Irrevocable</CompanyTypeName>
   <CompanyTypeDesc>Irrevocable Trust</CompanyTypeDesc>
   <IsBusiness>N</IsBusiness>
  </CompanyType>
 <CompanyType>
   <CompanyTypeID>4</CompanyTypeID>
   <CompanyTypeName>Trust Revocable</CompanyTypeName>
   <CompanyTypeDesc>Revocable Trust</CompanyTypeDesc>
   <IsBusiness>N</IsBusiness>
  </CompanyType>
</CompanyTypesIndividual>

和 ISBusiness = Y

<CompanyTypesBusiness>
  <CompanyType>
   <CompanyTypeID>3</CompanyTypeID>
   <CompanyTypeName>Trust Irrevocable</CompanyTypeName>
   <CompanyTypeDesc>Irrevocable Trust</CompanyTypeDesc>
   <IsBusiness>Y</IsBusiness>
  </CompanyType>
<CompanyType>
   <CompanyTypeID>3</CompanyTypeID>
   <CompanyTypeName>Trust Irrevocable</CompanyTypeName>
   <CompanyTypeDesc>Irrevocable Trust</CompanyTypeDesc>
   <IsBusiness>Y</IsBusiness>
  </CompanyType>
</CompanyTypesBusiness>

非常感谢您的反馈

我无法将您的输入与预期输出相关联。 使用 IsBusiness = 'N' 获取 CompanyType 的 xpath 将是:

/CompanyTypes/CompanyType[IsBusiness = 'N']

以下 XSLT

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 <xsl:output method="xml"  omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
 <xsl:strip-space elements="*"/>
  <xsl:template match="/">
    <CompanyTypesIndividual>
      <xsl:apply-templates select="CompanyTypes/CompanyType[IsBusiness='N']"/>
    </CompanyTypesIndividual>
    <CompanyTypesBusiness>
      <xsl:apply-templates select="CompanyTypes/CompanyType[IsBusiness='Y']"/>
    </CompanyTypesBusiness>
  </xsl:template>
  <xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:transform>

当应用于您的输入时 XML 产生所需的输出。
匹配 XML 根的模板将模板应用到所有 CompanyTypes,其中 IsBusiness='N' 包装在 <CompanyTypesIndividual> 组中,然后应用于所有 CompanyTypes,其中 IsBusiness='Y' 包装在 <CompanyTypesBusiness> 组中。应用的<xsl:template match="@*|node()">只是复制节点和属性。
为了方便起见,我保存了转换 here

更新: 正如 michael.hor257k 在评论中指出的那样,此结果无效 XML。要具有有效的 XML,结果文件必须以相同的元素开始和结束,例如通过此调整:

<xsl:template match="/">
    <CompanyTypes>
      <CompanyTypesIndividual>
        <xsl:apply-templates select="CompanyTypes/CompanyType[IsBusiness='N']"/>
      </CompanyTypesIndividual>
      <CompanyTypesBusiness>
        <xsl:apply-templates select="CompanyTypes/CompanyType[IsBusiness='Y']"/>
      </CompanyTypesBusiness>
    <CompanyTypes>
</xsl:template>  

此外,您可能想要删除 omit-xml-declaration="yes" 或将其更改为 omit-xml-declaration="no" 以在输出 XML.[=22= 中保留 XML 声明]