-2

XML は:

<projects>
    <project>
        <name ID="A" StartDate='2012-01-01' EndDate='2012-01-30'>Shockwave</name> 
        <language>Ruby</language> 
        <Manager ID="M1">Nathan</Manager>
    </project>
    <project>
        <name ID="B" StartDate='2012-01-01' EndDate='2012-02-30'>Other</name> 
        <language>Erlang</language>
        <Manager ID="M2">Kristi</Manager>  
    </project>
</projects>

この XML を XSLT を使用して CSV にコピーしたいと考えています。そのようなプロジェクトは 1000 件あります。以下に示す出力を csv に取得するにはどうすればよいですか。

A;2012-01-01;2012-01-30;Shockwave;Ruby;M1;Nathan|B;2012-01-01;2012-02-30;Other;Erlang;M2;Kristi|   
4

2 に答える 2

1

代わりにこのようなことを試してください。要素のテキストの前に属性を出力します。

XML 入力

<projects>
    <project>
        <name ID="A">Shockwave</name> 
        <language>Ruby</language> 
    </project>
    <project>
        <name ID="B">Other</name> 
        <language>Erlang</language>  
    </project>
</projects>

XSLT1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/> 

    <xsl:template match="project">
        <xsl:apply-templates select="@*|node()"/>
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:value-of select="."/>
        <xsl:if test="../text() or parent::project">
            <xsl:text>,</xsl:text>
        </xsl:if>
    </xsl:template>

    <xsl:template match="*[ancestor::project]">
        <xsl:apply-templates select="@*"/>
        <xsl:if test="preceding-sibling::*">
            <xsl:text>,</xsl:text>
        </xsl:if>
        <xsl:value-of select="."/>
    </xsl:template>

</xsl:stylesheet>

出力

A,Shockwave,Ruby
B,Other,Erlang

新しい要件の編集

XML 入力

<projects>
    <project>
        <name ID="A" StartDate='2012-01-01' EndDate='2012-01-30'>Shockwave</name> 
        <language>Ruby</language> 
        <Manager ID="M1">Nathan</Manager>
    </project>
    <project>
        <name ID="B" StartDate='2012-01-01' EndDate='2012-02-30'>Other</name> 
        <language>Erlang</language>
        <Manager ID="M2">Kristi</Manager>  
    </project>
</projects>

XSLT1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/> 

    <xsl:template match="project">
        <xsl:apply-templates select="@*|node()"/>
        <xsl:text>|</xsl:text>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:if test="count(parent::*/@*)=1 and not(parent::project)">
            <xsl:text>;</xsl:text>
        </xsl:if>
        <xsl:value-of select="."/>
        <xsl:if test="parent::project or (last())">
            <xsl:text>;</xsl:text>
        </xsl:if>
    </xsl:template>

    <xsl:template match="*[ancestor::project]">
        <xsl:apply-templates select="@*"/>
        <xsl:if test="preceding-sibling::* and not(@*)">
            <xsl:text>;</xsl:text>
        </xsl:if>
        <xsl:value-of select="."/>
    </xsl:template>

</xsl:stylesheet>

出力

A;2012-01-01;2012-01-30;Shockwave;Ruby;M1;Nathan|B;2012-01-01;2012-02-30;Other;Erlang;M2;Kristi|
于 2013-05-17T22:47:03.097 に答える
1

リンク先のソリューションを使用しますが、行を変更します

<xsl:for-each select="child::*">

<xsl:for-each select="child::*|attribute::*">

これにより、属性とノードが選択されます。

于 2013-05-16T18:19:12.233 に答える