2015-12-02 64 views
0

我很感激任何人都可以幫助我。我正嘗試使用相應的XSLT轉換將此XML輸出到CSV文件中。用戶具有分配給他/她的許多角色和組。一些角色直接分配,另一些則通過組分配。我想根據分配給她這個樣子每個角色或組用戶新行:XSLT到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> 
+0

在輸入XML中總會只有一個用戶嗎? –

回答

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

非常感謝。非常努力! – Adia