一对多映射-使用XSLT将XML转换为CSV

一对多映射-使用XSLT将XML转换为CSV,xml,csv,xslt,xslt-2.0,Xml,Csv,Xslt,Xslt 2.0,我正在使用XSL转换将XML文件转换为CSV文件 我可以在CSV文件中获得identity属性值,但我也想获得重复元素的(备注)属性 我的XML是: <library> <book> <name identity="book1"/> <Remark id="1"/> <Remark id="2" /> </book> <book> <name identity="

我正在使用XSL转换将XML文件转换为CSV文件

我可以在CSV文件中获得identity属性值,但我也想获得重复元素的(备注)属性

我的XML是:

<library>
  <book>
    <name identity="book1"/>
    <Remark id="1"/>
    <Remark id="2" />
  </book>
  <book>
    <name identity="book2"/>
    <Remark id="3"/>
    <Remark id="4" />
  </book>
</library>
请给出建议。

请尝试以下方法:

<xsl:template match="/library">
    <xsl:text>name_identity,remark_id&#10;</xsl:text>
    <xsl:for-each select="book/Remark">
        <xsl:value-of select="../name/@identity"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="@id"/>
        <xsl:if test="position()!=last()">
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

姓名、身份、备注、id和10;
,



如果您使用的是XSLT2.0,那么可以使用分组。以下代码按
name/@identity

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xs="http://www.w3.org/2001/XMLSchema" >
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:text>name_identity,remark_id&#10;</xsl:text>
    <xsl:for-each-group select="/library/book" group-by="name/@identity">
        <xsl:for-each select="current-group()/Remark">
            <xsl:value-of select="current-grouping-key()"/>
            <xsl:text>,</xsl:text>
            <xsl:value-of select="@id"/>
            <xsl:if test="position() != last()">
                <xsl:text>&#10;</xsl:text>
            </xsl:if>
        </xsl:for-each>
        <xsl:if test="position() != last()">
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
    </xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>

姓名、身份、备注、id和10;
,





上面的链接没有重复的子元素我得到的结果集为空
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xs="http://www.w3.org/2001/XMLSchema" >
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:text>name_identity,remark_id&#10;</xsl:text>
    <xsl:for-each-group select="/library/book" group-by="name/@identity">
        <xsl:for-each select="current-group()/Remark">
            <xsl:value-of select="current-grouping-key()"/>
            <xsl:text>,</xsl:text>
            <xsl:value-of select="@id"/>
            <xsl:if test="position() != last()">
                <xsl:text>&#10;</xsl:text>
            </xsl:if>
        </xsl:for-each>
        <xsl:if test="position() != last()">
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
    </xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>