【问题标题】:One to many mapping- conversion from XML to CSV using XSLT使用 XSLT 从 XML 到 CSV 的一对多映射转换
【发布时间】:2015-03-26 17:50:50
【问题描述】:

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

我可以在 CSV 文件中获取标识属性值。但我也想获取重复元素的(备注)属性。

我的 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>

我需要一个如下的 CSV:

name_identity,remark_id
book1,1
book1,2
book2,3
book2,4

请就此提出建议。

【问题讨论】:

  • 以上链接没有重复的子元素

标签: xml csv xslt xslt-2.0


【解决方案1】:

试试这个方法:

<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>

【讨论】:

  • 我得到空的结果集
【解决方案2】:

如果您使用的是 XSLT 2.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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2017-05-23
    • 2011-10-28
    相关资源
    最近更新 更多