排除父母&某个节点符合条件

时间:2017-10-10 12:47:13

标签: xml xslt xslt-2.0

我在下面有一个初始输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<pi:Payroll_Extract_Employees xmlns:pi="urn:com.workday/picof">
 <pi:Employee>
     <pi:Summary>
         <pi:Employee_ID>00000001</pi:Employee_ID>
     </pi:Summary>
     <pi:Additional_Information>
        <pi:Worker_Type>NSW</pi:Worker_Type>
        <pi:Strike_1>11-sept.-2017,2 Hours=9570</pi:Strike_1>
     </pi:Additional_Information>
  </pi:Employee>
  <pi:Employee>
    <pi:Summary>
       <pi:Employee_ID>00000002</pi:Employee_ID>
    </pi:Summary>
    <pi:Additional_Information>
       <pi:Worker_Type>SW</pi:Worker_Type>
       <pi:Strike_1>22-sept.-2017,8 Hours=9570</pi:Strike_1>
    </pi:Additional_Information>
  </pi:Employee>
</pi:Payroll_Extract_Employees>

和XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
xmlns:pi="urn:com.workday/picof"
version="2.0">

<xsl:output indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
    <pi:Payroll_Extract_Employees>
        <xsl:for-each select="//pi:Employee">
        <pi:Employee>
            <xsl:copy-of select="pi:Summary"/>
            <xsl:apply-templates select="pi:Additional_Information/*"/>
        </pi:Employee>
        </xsl:for-each>
    </pi:Payroll_Extract_Employees>     
</xsl:template>

<xsl:template match="pi:Additional_Information/*">
    <xsl:apply-templates select="ancestor::pi:Payroll_Extract_Employees">
        <xsl:with-param name="UnpaidTO" select="current()"/>
    </xsl:apply-templates>
</xsl:template>

<xsl:template match="pi:Payroll_Extract_Employees">
    <xsl:param name="UnpaidTO"/>
        <pi:Time_Off>
            <pi:Code_Name>Unpaid Time Off</pi:Code_Name>
            <pi:Time_Off_Type><xsl:value-of select="substring-after($UnpaidTO,'=')"/></pi:Time_Off_Type>
            <pi:Time_Off_Date><xsl:value-of select="substring-before($UnpaidTO,',')"/></pi:Time_Off_Date>
            <pi:Quantity><xsl:value-of select="substring-before(substring-after($UnpaidTO,','),' ')"/></pi:Quantity>
            <pi:Unit_of_Time><xsl:value-of select="substring-after(substring-before($UnpaidTO,'='),' ')"/></pi:Unit_of_Time>
        </pi:Time_Off>   
</xsl:template>   
</xsl:stylesheet>

但问题在于,我需要将所有工人类型排除在等于 SW 的范围内,并仅将上面的xslt代码应用于工作人员类型 NSW 。我的最终代码应该是什么才能达到我预期的结果?

<?xml version="1.0" encoding="UTF-8"?>
<pi:Payroll_Extract_Employees xmlns:pi="urn:com.workday/picof">
  <pi:Employee>
     <pi:Summary>
        <pi:Employee_ID>00000001</pi:Employee_ID>
     </pi:Summary>
     <pi:Time_Off>
        <pi:Code_Name>Unpaid Time Off</pi:Code_Name>
        <pi:Time_Off_Type>9570</pi:Time_Off_Type>
        <pi:Time_Off_Date>11-sept.-2017</pi:Time_Off_Date>
        <pi:Quantity>2</pi:Quantity>
        <pi:Unit_of_Time>Hours</pi:Unit_of_Time>
     </pi:Time_Off>
  </pi:Employee>
</pi:Payroll_Extract_Employees>

提前谢谢!

1 个答案:

答案 0 :(得分:1)

只需改变这一行......

<xsl:for-each select="//pi:Employee">

<xsl:for-each select="//pi:Employee[i:Additional_Information/pi:Worker_Type = 'NSW']">

或许这......

<xsl:for-each select="//pi:Employee[not(i:Additional_Information/pi:Worker_Type = 'SW')]">