XSLT 2.0:根据条件从输入 XML 中删除节点
XSLT 2.0: Remove nodes from input XML based on condition
我有一个 XML 可能包含多个 employment_information 节点。我需要 select 具有子字段 assignment_class 的那个 'GA'。应丢弃其他 employment_information 个节点。
另外,如果只有一个employment_information节点,那么就直接传过去。
输入XML:
<?xml version="1.0" encoding="utf-8"?>
<queryCompoundEmployeeResponse>
<CompoundEmployee>
<Person>
<StartDate>2012-02-01</StartDate>
<EndDate>2019-02-28</EndDate>
<action>NO CHANGE</action>
<employment_information>
<action>NO CHANGE</action>
<assignment_class>ST</assignment_class>
</employment_information>
<employment_information>
<action>NO CHANGE</action>
<assignment_class>GA</assignment_class>
</employment_information>
</Person>
</CompoundEmployee>
</queryCompoundEmployeeResponse>
预期输出:
<?xml version="1.0" encoding="UTF-8"?>
<queryCompoundEmployeeResponse>
<CompoundEmployee>
<Person>
<StartDate>2012-02-01</StartDate>
<EndDate>2019-02-28</EndDate>
<action>NO CHANGE</action>
<employment_information>
<action>NO CHANGE</action>
<assignment_class>GA</assignment_class>
</employment_information>
</Person>
</CompoundEmployee>
</queryCompoundEmployeeResponse>
在参考了一些在线帖子后,我使用以下 XSLT 部分地实现了这一点:
<?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:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//Person/employment_information[assignment_class!='GA']"/>
</xsl:stylesheet>
但我需要增强此 XSLT 以最终具有以下逻辑:
- 计数employment_information
- 如果 Count 大于 1,则 select employment_information 与 assignment_class 作为 'GA' 以及输入中的其他节点。
- 否则(即如果计数为 0 或 1)将输入原样复制到输出。
感谢任何帮助。谢谢!
如果我没看错的话,您可以通过以下一种方式查看它:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="employment_information[assignment_class!='GA' and count(../employment_information) gt 1]"/>
</xsl:stylesheet>
我有一个 XML 可能包含多个 employment_information 节点。我需要 select 具有子字段 assignment_class 的那个 'GA'。应丢弃其他 employment_information 个节点。 另外,如果只有一个employment_information节点,那么就直接传过去。
输入XML:
<?xml version="1.0" encoding="utf-8"?>
<queryCompoundEmployeeResponse>
<CompoundEmployee>
<Person>
<StartDate>2012-02-01</StartDate>
<EndDate>2019-02-28</EndDate>
<action>NO CHANGE</action>
<employment_information>
<action>NO CHANGE</action>
<assignment_class>ST</assignment_class>
</employment_information>
<employment_information>
<action>NO CHANGE</action>
<assignment_class>GA</assignment_class>
</employment_information>
</Person>
</CompoundEmployee>
</queryCompoundEmployeeResponse>
预期输出:
<?xml version="1.0" encoding="UTF-8"?>
<queryCompoundEmployeeResponse>
<CompoundEmployee>
<Person>
<StartDate>2012-02-01</StartDate>
<EndDate>2019-02-28</EndDate>
<action>NO CHANGE</action>
<employment_information>
<action>NO CHANGE</action>
<assignment_class>GA</assignment_class>
</employment_information>
</Person>
</CompoundEmployee>
</queryCompoundEmployeeResponse>
在参考了一些在线帖子后,我使用以下 XSLT 部分地实现了这一点:
<?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:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//Person/employment_information[assignment_class!='GA']"/>
</xsl:stylesheet>
但我需要增强此 XSLT 以最终具有以下逻辑:
- 计数employment_information
- 如果 Count 大于 1,则 select employment_information 与 assignment_class 作为 'GA' 以及输入中的其他节点。
- 否则(即如果计数为 0 或 1)将输入原样复制到输出。
感谢任何帮助。谢谢!
如果我没看错的话,您可以通过以下一种方式查看它:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="employment_information[assignment_class!='GA' and count(../employment_information) gt 1]"/>
</xsl:stylesheet>