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) 代替 ||
。
如果此问题已在其他地方得到解答,我深表歉意,但我一直无法找到解决方案。我正在为 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) 代替 ||
。