XSLT到CSV:输出元素到多行

时间:2015-12-02 20:25:43

标签: xml csv xslt

如果有人能帮助我,我感激不尽。我正在尝试使用相应的XSLT转换将此XML输出到CSV文件中。用户具有分配给他/她的许多角色和组。有些角色是直接分配的,有些是通过组分配的。我想根据分配给她的每个角色或组为用户创建新行:

User;Account;Service;Group;Role
Natalie Petit; petna; S1; G1; R1; 
Natalie Petit; petna; S1; G1; R2; 
Natalie Petit; petna;S2;;R1; 
Natalie Petit; petna;S2;;R3; 

这是XML源:

 <?xml version="1.0" encoding="UTF-8"?>
<provider>
<service>
<name>S1</name>
<group>
<name>G1</name>
<role>
<name>R1</name>
<name>R2</name>
</role>
</group>
</service>

<service>
<name>S2</name>
<group/>
<role>
<name>R1</name>
<name>R3</name>
</role>
</service>
<user>
<name>Natalie Petit</name>
<account>petna</account>
</user>
</provider>

这是我的XSLT,但不会让我在那里:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="@*|node()">
<xsl:text>User;Account;Service;Group;Role</xsl:text>
  <xsl:apply-templates/>  
</xsl:template>

<xsl:template match="service">
<xsl:for-each select=".">
    <xsl:value-of select="name"/>
    <xsl:text>;</xsl:text>
    </xsl:for-each>
    <xsl:apply-templates select="role"/>  
    <xsl:apply-templates select="group"/>
</xsl:template>

<xsl:template match="group">
<xsl:for-each select=".">
    <xsl:value-of select="name"/>
    <xsl:text>;</xsl:text>
    </xsl:for-each>
<xsl:apply-templates select="role"/>
</xsl:template>

<xsl:template match="role">
<xsl:for-each select=".">
    <xsl:value-of select="name"/>
    <xsl:text>;</xsl:text>
    </xsl:for-each>
</xsl:template>

1 个答案:

答案 0 :(得分:0)

以这种方式尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/provider">
    <xsl:variable name="usr">
        <xsl:value-of select="user/name"/>
        <xsl:text>;</xsl:text>
        <xsl:value-of select="user/account"/>
        <xsl:text>;</xsl:text>
    </xsl:variable>
    <xsl:text>User;Account;Service;Group;Role&#10;</xsl:text>
    <xsl:for-each select="service/role/name | service/group/role/name">
        <xsl:copy-of select="$usr"/>
        <xsl:value-of select="ancestor::service/name"/>
        <xsl:text>;</xsl:text>
        <xsl:value-of select="ancestor::group/name"/>
        <xsl:text>;</xsl:text>
        <xsl:value-of select="."/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each> 
</xsl:template>

</xsl:stylesheet>