>我有一个具有以下结构的XML:
<Root>
<Record>
<Field1>ABC</Field1>
<Field2>DEF</Field2>
<MatchingSubRecords>
<SubField1>SUB01</SubField1>
<SubField2>SUB02</SubField2>
</MatchingSubRecords>
<MatchingSubRecords>
<SubField1>SUB11</SubField1>
<SubField2>SUB11</SubField2>
</MatchingSubRecords>
<MatchingSubRecords>
<SubField1>SUB21</SubField1>
<SubField2>SUB22</SubField2>
</MatchingSubRecords>
</Record>
</Root>
虽然我有一个简单的 XSLT 将每条记录转换为文本输出
Field1, Field2
ABC,DEF
我想将每个匹配的子记录都作为单独的文件或单独的分隔字符作为主 CSV 输出本身的一部分放在类似的 CSV 输出中,例如
ABC, DEF, "SUB01,SUB11,SUB21|SUB02,SUB12,SUB22"
如果有可能使用 XslCompiledTransform 将其流式写入两个文件,那就完美了。如果没有,我将不得不稍后解析它,这也很好。
你可以试试这个:
<?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="1.0">
<xsl:output method="text"/>
<xsl:template match="/Root/Record">
<xsl:value-of select="concat(Field1, ', ', Field2, ', ')"/>
<xsl:text>"</xsl:text>
<xsl:for-each select="MatchingSubRecords/SubField1">
<xsl:value-of select="."/>
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text>|</xsl:text>
<xsl:for-each select="MatchingSubRecords/SubField2">
<xsl:value-of select="."/>
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text>"</xsl:text>
</xsl:template>
</xsl:stylesheet>
通过简单的转换,您可以实现所需的输出:
<?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="1.0">
<xsl:output method="text"/>
<xsl:template match="/Root/Record">
<xsl:value-of select="concat(Field1, ',', Field2, '
')"/>
<xsl:for-each select="MatchingSubRecords">
<xsl:value-of select="concat(SubField1, ',', SubField2)"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
如果您有多个 n 次出现,那么您可以像下面这样使用而不指定元素名称:
<?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="1.0">
<xsl:output method="text"/>
<xsl:template match="/Root/Record">
<xsl:for-each select="*[not(self::MatchingSubRecords)]">
<xsl:value-of select="."/>
<xsl:if test="position()!=last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:for-each select="MatchingSubRecords">
<xsl:text>
</xsl:text>
<xsl:for-each select="*">
<xsl:value-of select="."/>
<xsl:if test="position()!=last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
请参阅此链接供您参考:https://xsltfiddle.liberty-development.net/ejivdHr