如果有人能帮助我,我感激不尽。我正在尝试使用相应的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>
答案 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 </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> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>