使用基于子节点的 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 声明]
我有下面的 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 声明]