XSL:for-each - XML 中的重复节点出现问题,需要输出到 CSV 文件中的单独行

XSL:for-each - Trouble with duplicate nodes in XML, needs to be output to separate lines in a CSV file

如果此问题已在其他地方得到解答,我深表歉意,但我一直无法找到解决方案。我正在为 Microsoft School Data Sync 准备一个数据集,我在其中根据 XML 文件生成许多 CSV 文件。在该文件中,我有许多具有一种或多种护理关系的护理人员 (children)。在输出的 CSV 中,我需要每个 child 都在单独的一行中,每个都有他们的护理人员的联系信息(电子邮件)。但是,我无法让 xsl:for-each 正常工作。非常感谢任何帮助或反馈!

XML -> 这是一个有两个children的护工:

<person recstatus="1">
    <sourcedid>
      <id>e763fb61-2086-40af-9eb6-d5355d5922bc</id>
    </sourcedid>
    <name>
      <fn>Smith,John</fn>
      <n>
        <family>Smith</family>
        <given>John</given>
      </n>
    </name>
    <email>john.smith@email.com</email>
    <institutionrole institutionroletype="Carer" primaryrole="Yes" />
    <extension>
      <carerrelationship recstatus="1">
        <sourcedid>
          <id>04ba28e9-0934-41c9-aa42-31c0b66f36ad</id>
        </sourcedid>
        <sourcedid>
          <id>300c42ca-c78a-4ec9-9d81-9acb2382bbca</id>
        </sourcedid>
      </carerrelationship>
    </extension>
</person>

这是我的 XSL

 <xsl:result-document href="Guardianrelationship.csv" method="text">
            <xsl:text>SIS ID,Email,Role</xsl:text><xsl:value-of select="$break"/>
            <xsl:for-each select="person[institutionrole/@institutionroletype = 'Carer']/extension/carerrelationship">
                <xsl:variable name="person" select="."/>
                <xsl:value-of select="sourcedid/id"/><xsl:value-of select="$delimiter"/>
                <xsl:value-of select="ancestor::person/email"/><xsl:value-of select="$delimiter"/>
                <xsl:text>Guardian</xsl:text><xsl:value-of select="$break"/>    
            </xsl:for-each>
</xsl:result-document>

预期结果:

SIS ID,Email,Role
04ba28e9-0934-41c9-aa42-31c0b66f36ad,john.smith@email.com.no,Guardian
300c42ca-c78a-4ec9-9d81-9acb2382bbca,john.smith@email.no,Guardian

实际结果:

SIS ID,Email,Role
04ba28e9-0934-41c9-aa42-31c0b66f36ad 300c42ca-c78a-4ec9-9d81-9acb2382bbca,rw347@kirken.no,Guardian

您目前正在为每个 carerrelationship 输出一行,您需要为每个 sourcedid 输出一行。

例如

<xsl:for-each select="person[institutionrole/@institutionroletype = 'Carer']/extension/carerrelationship/sourcedid">
     <xsl:value-of select="id"/><xsl:value-of select="$delimiter"/>
     <xsl:value-of select="ancestor::person/email"/><xsl:value-of select="$delimiter"/>
     <xsl:text>Guardian</xsl:text><xsl:value-of select="$break"/>    
</xsl:for-each>

你可以简化为

<xsl:for-each select="person[institutionrole/@institutionroletype = 'Carer']/extension/carerrelationship/sourcedid">
     <xsl:value-of select="id || $delimiter || ancestor::person/email || $delimiter || 'Guardian' || $break"/>    
</xsl:for-each>

或者如果使用 2.0 而不是 3.0,则使用 concat(x,y,z) 代替 ||