【问题标题】:XSLT to CSV: output element to multiple rowsXSLT 到 CSV:输出元素到多行
【发布时间】:2016-03-07 06:15:06
【问题描述】:

如果有人可以帮助我,我将不胜感激。我正在尝试使用相应的 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>

【问题讨论】:

  • 输入 XML 中是否总是只有一个用户?

标签: xml csv xslt


【解决方案1】:

试试这个方法:

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>

【讨论】:

  • 非常感谢。工作得很好!
猜你喜欢
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
相关资源
最近更新 更多