XSLT 包含错误

XSLT contains error

对于粗略的解释,我深表歉意,我对 xml 和 xslt 还很陌生。感谢您的耐心等待。

挑战来了,我正在尝试构建到 csv 的转换,为员工福利注册的每个实例创建一个新行。因此,如果他们参加了两个计划,则会为每个计划创建一条线路。他们的家属也在做同样的事情。
使用我的 xml,我如何遍历不同的节点并选择正确的数据?

在尝试确保我不会为未参加福利的家属划线时,我遇到了这个错误:

说明:XPTY0004:不允许将多个项目的序列作为 contains() 的第一个参数("System_ID"、"Dependent_ID"、...)

我看到 Dependent 元素中有不止一种 ID 类型,但我不想指定使用哪一种,因为我需要同时扫描它们。

这是我的 xml:

<Report>
    <Employee_ID>111111</Employee_ID>
    <Last_Name>Allen</Last_Name>
    <First_Name>Amy</First_Name>
    <Benefit_Elections>
        <Benefit_Type>Accident</Benefit_Type>
        <Coverage>Employee + Family</Coverage>
        <Enrolled_Worker Descriptor="Amy Allen (111111)">
            <ID type="System_ID">aaaaaa</ID>
            <ID type="Employee_ID">111111</ID>
        </Enrolled_Worker>
        <Benefit_Plan Descriptor="Accident">
            <ID type="System_ID">121212</ID>
            <ID type="Health_Care_ID">hcp01</ID>
        </Benefit_Plan>
        <Covered_Dependents Descriptor="Sally Allen">
            <ID type="System_ID">bbbbbb</ID>
            <ID type="Dependent_ID">22222</ID>
        </Covered_Dependents>
        <Covered_Dependents Descriptor="Bob Allen">
            <ID type="System_ID">ffffff</ID>
            <ID type="Dependent_ID">44444</ID>
        </Covered_Dependents>
    </Benefit_Elections>
    <Benefit_Elections>
        <Benefit_Type>Critical Illness</Benefit_Type>
        <Coverage>,000</Coverage>
        <Calculated_Coverage>,000</Calculated_Coverage>
        <Enrolled_Worker Descriptor="Amy Allen (111111)">
            <ID type="System_ID">aaaaaa</ID>
            <ID type="Employee_ID">111111</ID>
        </Enrolled_Worker>
        <Benefit_Plan
            Descriptor="Critical Illness (Child)">
            <ID type="System_ID">ssssss</ID>
            <ID type="Insurance_Coverage_Plan_ID">icpchild</ID>
        </Benefit_Plan>
        <Covered_Dependents Descriptor="Sally Allen">
            <ID type="System_ID">bbbbbb</ID>
            <ID type="Dependent_ID">22222</ID>
        </Covered_Dependents>
    </Benefit_Elections>
    <Benefit_Elections>
        <Benefit_Type>Critical Illness</Benefit_Type>
        <Coverage>,000</Coverage>
        <Calculated_Coverage>,000</Calculated_Coverage>
        <Enrolled_Worker Descriptor="Amy Allen (111111)">
            <ID type="System_ID">aaaaaa</ID>
            <ID type="Employee_ID">111111</ID>
        </Enrolled_Worker>
        <Benefit_Plan
            Descriptor="Critical Illness (Spouse)">
            <ID type="System_ID">tttttt</ID>
            <ID type="Insurance_Coverage_Plan_ID">icpspouse</ID>
        </Benefit_Plan>
        <Covered_Dependents Descriptor="Bob Allen">
            <ID type="System_ID">ffffff</ID>
            <ID type="Dependent_ID">44444</ID>
        </Covered_Dependents>
    </Benefit_Elections>
    <Benefit_Elections>
        <Benefit_Type>Critical Illness</Benefit_Type>
        <Coverage>,000</Coverage>
        <Calculated_Coverage>,000</Calculated_Coverage>
        <Enrolled_Worker Descriptor="Amy Allen (111111)">
            <ID type="System_ID">aaaaaa</ID>
            <ID type="Employee_ID">111111</ID>
        </Enrolled_Worker>
        <Benefit_Plan
            Descriptor="Critical Illness (Employee)">
            <ID type="System_ID">uuuuuu</ID>
            <ID type="Insurance_Coverage_Plan_ID">icpemployee</ID>
        </Benefit_Plan>
    </Benefit_Elections>
    <Dependents>
        <First_Name>Sally</First_Name>
        <Last_Name>Allen</Last_Name>
        <Relationship Descriptor="Child">
            <ID type="Related_Person_Relationship_ID">Child</ID>
        </Relationship>
        <Dependent_ID Descriptor="Sally Allen">
            <ID type="System_ID">bbbbbb</ID>
            <ID type="Dependent_ID">22222</ID>
        </Dependent_ID>
    </Dependents>
    <Dependents>
        <First_Name>Bob</First_Name>
        <Last_Name>Allen</Last_Name>
        <Relationship Descriptor="Spouse">
            <ID type="Related_Person_Relationship_ID">Spouse</ID>
        </Relationship>
        <Uses_Tobacco>0</Uses_Tobacco>
        <Dependent_ID Descriptor="Bob Allen">
            <ID type="System_ID">ffffff</ID>
            <ID type="Dependent_ID">44444</ID>
        </Dependent_ID>
    </Dependents>
</Report>

这是我的 xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:template match="/">
            <xsl:for-each select="Report">
                <Record>
                    <xsl:call-template name="EmployeeData"/>
                    <xsl:for-each select="Dependents">
                        <xsl:call-template name="Print_Dependents">
                            <xsl:with-param name="BenefitsExtractEmployeeNode" select=".."/>
                        </xsl:call-template>
                    </xsl:for-each>
                </Record>
            </xsl:for-each>
    </xsl:template>
    <xsl:template name="EmployeeData">
     <First_Name><xsl:value-of select="First_Name"/></First_Name>   
        <Last_Name><xsl:value-of select="Last_Name"/></Last_Name>
        <Benefit_Type><xsl:value-of select="Benefit_Elections/Benefit_Type"/></Benefit_Type>
        <Coverage><xsl:value-of select="Benefit_Elections/Coverage"/></Coverage>
        <Calculated_Coverage><xsl:value-of select="Benefit_Elections/Calculated_Coverage"/></Calculated_Coverage> 
    </xsl:template>
    <xsl:template name="Print_Dependents">
        <xsl:param name="BenefitsExtractEmployeeNode"/>
        <xsl:if test="contains($BenefitsExtractEmployeeNode/Benefit_Elections/Covered_Dependents[ID/@type ='Dependent_ID']/ID/@type, 
            Dependents/Dependent_ID[ID/@type='Dependent_ID']/ID/@type)">
       <Dependent>
           <First_Name><xsl:value-of select="Dependents/First_Name"/></First_Name>   
           <Last_Name><xsl:value-of select="Dependents/Last_Name"/></Last_Name>
           <Benefit_Type><xsl:value-of select="$BenefitsExtractEmployeeNode/Benefit_Elections/Benefit_Type"/></Benefit_Type>
           <Coverage><xsl:value-of select="$BenefitsExtractEmployeeNode/Benefit_Elections/Coverage"/></Coverage>
           <Calculated_Coverage><xsl:value-of select="$BenefitsExtractEmployeeNode/Benefit_Elections/Calculated_Coverage"/></Calculated_Coverage>
       </Dependent>     
        </xsl:if>
    </xsl:template> 
</xsl:stylesheet>

如果没有所需输出的示例,很难确切地说出您要做什么(您提到转换为 CSV,但您的 XSLT 正在输出 XML)。

但是,您应该能够在 xsl:if 测试中将 contains() 移动到 ID 元素...

    <xsl:if test="$BenefitsExtractEmployeeNode/Benefit_Elections/Covered_Dependents[
        ID/@type ='Dependent_ID']/ID[contains(@type, 
        Dependents/Dependent_ID[ID/@type='Dependent_ID']/ID/@type)]">
        ...
    </xsl:if>