Xml XSLT包含错误

Xml XSLT包含错误,xml,xslt,foreach,contains,Xml,Xslt,Foreach,Contains,很抱歉,我的解释很粗糙,我对xml和xslt相当陌生。谢谢你的耐心 这是挑战,我正在尝试构建一个到csv的转换,为员工福利登记的每个实例创建一个新行。因此,如果他们在两个计划中注册,则会为每个计划创建一行。他们的受抚养人也是如此。 使用xml,我如何循环不同的节点并选择正确的数据 在尝试确保不为未参加福利的受抚养人设置行时,我遇到了以下错误: 描述:XPTY0004:包含多个项的序列不允许作为contains()的第一个参数(“系统ID”、“依赖ID”、…) 我看到一个依赖元素中有不止一种ID类

很抱歉,我的解释很粗糙,我对xml和xslt相当陌生。谢谢你的耐心

这是挑战,我正在尝试构建一个到csv的转换,为员工福利登记的每个实例创建一个新行。因此,如果他们在两个计划中注册,则会为每个计划创建一行。他们的受抚养人也是如此。
使用xml,我如何循环不同的节点并选择正确的数据

在尝试确保不为未参加福利的受抚养人设置行时,我遇到了以下错误:

描述:XPTY0004:包含多个项的序列不允许作为contains()的第一个参数(“系统ID”、“依赖ID”、…)

我看到一个依赖元素中有不止一种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>$10,000</Coverage>
        <Calculated_Coverage>$10,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>$15,000</Coverage>
        <Calculated_Coverage>$15,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>$30,000</Coverage>
        <Calculated_Coverage>$30,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>

111111
艾伦
艾米
意外事故
员工+家庭
AAAAA
111111
121212
hcp01
bbbbbb
22222
ffffff
44444
危重病
$10,000
$10,000
AAAAA
111111
SSSS
icpchild
bbbbbb
22222
危重病
$15,000
$15,000
AAAAA
111111
tttttt
ICPShouse
ffffff
44444
危重病
$30,000
$30,000
AAAAA
111111
乌乌
ICP雇员
俏皮话
艾伦
小孩
bbbbbb
22222
上下快速移动
艾伦
配偶
0
ffffff
44444
以下是我的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)

但是,您应该能够将
contains()
移动到
xsl:if
测试中的
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>

...

你说得对,我没有包括csv转换部分来尝试简化。谢谢如果有人能为我解释下一个难题,那就太好了。现在我可以得到这个值了,每个人在元素中得到4个值。每个节点一个。我如何确保每个人都有两份记录,一份是事故记录,另一份是相应的严重疾病记录?