Преобразование XML в CSV с использованием XSLT

Я пытаюсь преобразовать XML в csv с помощью xslt, я не знаком с xslt, поэтому просто читаю учебник и другие онлайн-ресурсы. Вот мой XML

<?xml version="1.0" encoding="UTF-8"?>
<impex>
    <test>
        <Employee />
        <UID>auma</UID>
        <Name>HR Manager</Name>
        <Groups />
        <Password>228781</Password>
    </test>
    <test>
        <Employee />
        <UID>auma1</UID>
        <Name>HR Manager</Name>
        <Groups />
        <Password>2287811</Password>
    </test>
</impex>

я использую следующий XSL для преобразования xml в csv

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:f="Functions"
  version="2.0">

<xsl:output method="text" />
 <xsl:param name="headerVal" select="'INSERT_UPDATE Employee;UID[unique=true];name;groups(uid);password'"/>


<xsl:template match="/impex">
     <xsl:apply-templates select="test[1]/*" mode="header"/>
    <xsl:apply-templates select="test" />
</xsl:template>


<xsl:template match="*" mode="header" >

    <xsl:value-of select="$headerVal" />
</xsl:template>

<xsl:template match="test">
    <xsl:apply-templates select="*"/>
</xsl:template>

<xsl:template match="*" >
    <xsl:value-of select="."/>
    <xsl:choose>
        <xsl:when test="position()=last()">
            <xsl:text>&#10;</xsl:text>
        </xsl:when>
        <xsl:otherwise>;</xsl:otherwise>
    </xsl:choose>
</xsl:template>


</xsl:stylesheet>

я пытаюсь определить свой заголовок csv, но это не работает для меня

вывод csv

INSERT_UPDATEEmployeeUID[unique=true]namegroups(uid)password
INSERT_UPDATEEmployeeUID[unique=true]namegroups(uid)password
INSERT_UPDATEEmployeeUID[unique=true]namegroups(uid)password
INSERT_UPDATEEmployeeUID[unique=true]namegroups(uid)password
INSERT_UPDATEEmployeeUID[unique=true]namegroups(uid)password
;auma;HR Manager;;228781
;auma1;HR Manager;;2287811

как показано ниже

<xsl:param name="headerVal" select="'INSERT_UPDATE Employee;UID[unique=true];name;groups(uid);password'"/>

Я предполагал, что это произошло из-за ; в значении select, но я даже удалил его и даже удалил пробел, но ничего не помогло. Я гуглил об этом, но не смог найти способ, как определить этот заголовок внутри моего файла xsl, чтобы я можно использовать этот заголовок для моего CSV

заранее спасибо


person Umesh Awasthi    schedule 17.08.2011    source источник


Ответы (1)


Проблема решена.

<xsl:apply-templates select="test[1]/*" mode="header"/>

Здесь я выбирал все элементы внутри test[1], и в моем XML у меня есть пять элементов внутри элемента test, поэтому я просто изменил эту строку на:

<xsl:apply-templates select="test[1]" mode="header"/>

и он работает нормально.

person Umesh Awasthi    schedule 17.08.2011
comment
Большое спасибо за публикацию этого. Это был ответ на мою проблему - сделать что-то очень похожее. По сути, мне также нужно преобразовать XML в CSV. Мой вывод более традиционно отформатирован, чем ваш (без операторов INSERT вверху). Как бы то ни было, мне не хватало трюка mode=header. Еще раз большое спасибо /большое/. - person tggagne; 07.11.2013