создать заголовок заголовка в CSV - PullRequest
0 голосов
/ 17 октября 2019

У меня есть входной XML, как показано ниже:

<sect1>
   <title>Intro</title>
   <sect2>
      <title>Purpose</title>
         <sect3>
             <title>Scope</title>
         </sect3>
   </sect2>   
   <sect2>
      <title>Take</title>
   <table><title>Table 1</title></table>
   </sect2>
</sect1>

Я создал XSL для указанного выше XML:

<xsl:variable name="xmlpath" select="/files/path"/>
    <xsl:variable name="rootLangLoc" select="/files/@xml:lang"/>

    <xsl:variable name="newline"><xsl:text>&#13;&#10;</xsl:text></xsl:variable>

    <xsl:variable name="linebreak"><xsl:text>
    </xsl:text>
    </xsl:variable>

    <xsl:template match="/">
    <xsl:text>Top Heading,Sub Heading</xsl:text>
        <xsl:value-of select="$linebreak"/>
        <xsl:for-each select="files/file">
            <xsl:variable name="FullName" select="concat($xmlpath, ., $rootLangLoc, '.xml')"/>
            <xsl:apply-templates select="document($FullName)" mode="csvprocess"/>
        </xsl:for-each>

<xsl:for-each select="/sect1/title">
            <xsl:apply-templates select="."/>

        <xsl:for-each select="/sect1/sect2/title">
            <xsl:value-of select="$newline"/>
            <xsl:text>,</xsl:text>
            <xsl:apply-templates select="/sect1/sect2/title"/>


            <xsl:for-each select="/sect1/sect2/sect3/title">
                <xsl:value-of select="$newline"/>
                <xsl:text>,</xsl:text>
                <xsl:text>,</xsl:text>
                <xsl:apply-templates select="/sect1/sect2/sect3/title"/>
            </xsl:for-each>

        </xsl:for-each>
        </xsl:for-each>
    </xsl:template>

Я получил вывод CSV, как:

Intro
,Purpose
,Take
,,Scope

Исключительные выходные данные будут:

Intro
,Purpose
,,Scope
,Take

Я хочу, чтобы все заголовки разделов были в правильном порядке согласно входному XML. Я получаю вывод как первый заголовок раздела 1 и следующий заголовок раздела 2 как.

1 Ответ

0 голосов
/ 17 октября 2019

Если я правильно угадываю логику, которую вы пытаетесь применить здесь, вы можете сделать следующее:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/">
    <xsl:text>Top Heading,Sub Heading&#10;</xsl:text>
    <xsl:for-each select="//title ">
        <xsl:value-of select="for $i in 1 to count(ancestor::*) - 1 return ','" separator=""/>
        <xsl:value-of select="."/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Демонстрация : https://xsltfiddle.liberty -development.net / bwdwrS


Еще один способ получить уровень текущего title:

substring-after(name(..), 'sect')
...