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 以最终具有以下逻辑:

  1. 计数employment_information
  2. 如果 Count 大于 1,则 select employment_information 与 assignment_class 作为 'GA' 以及输入中的其他节点。
  3. 否则(即如果计数为 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>