【问题标题】:Create TXT from XML using XSLT - display elements使用 XSLT 从 XML 创建 TXT - 显示元素
【发布时间】:2015-12-20 17:25:51
【问题描述】:

我正在尝试使用 xslt 从 xml 创建文本文件,但我遇到了问题。

这是我的 xml:

<?xml version="1.0" encoding="UTF-8"?>
<document>

  <płytoteka>
  <bestseller rok="2015">
     <płyta id="p01">
        <gatunek>Pop&amp;Rock</gatunek>
        <tytuł>Atramentowa</tytuł>
        <wykonawca>Celińska Stanisława</wykonawca>
        <data_premiery>2015-05-08</data_premiery>
        <cena>37.49</cena>
        <rok_nagrania>2015</rok_nagrania>
        <czas_trwania>51:19</czas_trwania>
        <czas_od_premiery>P222D</czas_od_premiery>
        <dostepnosc mp3="1" cd="0" dvd="1"/>
        <playlista>
           <utwór>Czerń i biel<czas>3:27</czas>
           </utwór>
           <utwór>Czy o kimś ktoś<czas>2:17</czas>
           </utwór>
           <utwór>Atramentowa rumba<czas>5:16</czas>
           </utwór>
           <utwór>Do rycerzy, do szlachty, do mieszczan<czas>3:22</czas>
           </utwór>
           <utwór>Drzwi odemknij<czas>3:21</czas>
           </utwór>
           <utwór>Moje życie, twoje życie<czas>3:19</czas>
           </utwór>
           <utwór>Obfitość<czas>3:20</czas>
           </utwór>
           <utwór>Jego portret<czas>3:15</czas>
           </utwór>
           <utwór>I znowu on<czas>3:11</czas>
           </utwór>
           <utwór>Nie strasz<czas>3:55</czas>
           </utwór>
           <utwór>Smuteczku mój<czas>3:44</czas>
           </utwór>
           <utwór>Szeptem do mnie mów<czas>3:33</czas>
           </utwór>
           <utwór>Wielka słota<czas>3:11</czas>
           </utwór>
           <utwór>Wakacje z deszczem<czas>2:59</czas>
           </utwór>
           <utwór>Pieśń cygańska<czas>3:09</czas>
           </utwór>
        </playlista>
     </płyta>
  </bestseller>
  </płytoteka>
  </document>

接下来是我的 xslt 代码:

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

    <xsl:template match="text()">
        <xsl:if test="normalize-space(.)">
            <xsl:value-of select="concat(normalize-space(.), '')"/>
        </xsl:if>
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="/">
        <xsl:text>TXT&#xA;</xsl:text>
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="płytoteka">
        <xsl:apply-templates select="bestseller"/>
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>

    <xsl:template match="bestseller">
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>BESTSELLER:</xsl:text>
        <xsl:value-of select="concat('&#x9;&#x9;',./@rok,'&#xA;')" />
        <xsl:text>&#xA;</xsl:text>
        <xsl:apply-templates select="płyta"/>
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>

    <xsl:template match="płyta">
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>PLYTA:&#xA;</xsl:text>
        <xsl:text>Gatunek:&#x9;</xsl:text>
        <xsl:apply-templates select="gatunek"/>
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>Tytul: &#x9;</xsl:text>
        <xsl:apply-templates select="tytuł"/>
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>Wykonawca: &#x9;</xsl:text>
        <xsl:apply-templates select="wykonawca"/>
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>Data premiery: &#x9;</xsl:text>
        <xsl:apply-templates select="data_premiery"/>
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>Cena: &#x9;</xsl:text>
        <xsl:apply-templates select="cena"/>
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>Rok nagrania: &#x9;</xsl:text>
        <xsl:apply-templates select="rok_nagrania"/>
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>Czas trwania: &#x9;</xsl:text>
        <xsl:apply-templates select="czas_trwania"/>
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>Czas od premiery: &#x9;</xsl:text>
        <xsl:apply-templates select="czas_od_premiery"/>
        <xsl:text>&#xA;</xsl:text>
        <xsl:apply-templates select="playlista"/>
    </xsl:template>

    <xsl:template match="playlista">
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>&#x9;&#x9;UTWORY:&#xA;&#x9;&#x9;</xsl:text>
        <xsl:for-each select="utwór">
            <xsl:value-of select="."/>
        </xsl:for-each>
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>

 </xsl:stylesheet>

我的输出:

TXT

BESTSELLER:     2015


PLYTA:
Gatunek:    Pop&Rock
Tytul:  Atramentowa
Wykonawca:  Celińska Stanisława
Data premiery:  2015-05-08
Cena:   37.49
Rok nagrania:   2015
Czas trwania:   51:19
Czas od premiery:   P222D

    UTWORY:
    Czerń i biel3:27
           Czy o kimś ktoś2:17
           Atramentowa rumba5:16
           Do rycerzy, do szlachty, do mieszczan3:22
           Drzwi odemknij3:21
           Moje życie, twoje życie3:19
           Obfitość3:20
           Jego portret3:15
           I znowu on3:11
           Nie strasz3:55
           Smuteczku mój3:44
           Szeptem do mnie mów3:33
           Wielka słota3:11
           Wakacje z deszczem2:59
           Pieśń cygańska3:09

问题是关于xml文件中的元素“utwór”和“czas”,我想在txt输出中显示这些元素,更划分,例如:

UTWORY:
        Czerń i biel     3:27
               Czy o kimś ktoś     2:17
               Atramentowa rumba     5:16
               Do rycerzy, do szlachty, do mieszczan     3:22
               Drzwi odemknij     3:21
               Moje życie, twoje życie     3:19
               Obfitość     3:20
               Jego portret     3:15
               I znowu on     3:11
               Nie strasz     3:55
               Smuteczku mój     3:44
               Szeptem do mnie mów     3:33
               Wielka słota     3:11
               Wakacje z deszczem     2:59
               Pieśń cygańska     3:09

我只是想在这些元素之间留出空间,或者更好地以某种顺序显示这两个元素,只是为了赏心悦目,比如:

    UTWORY:
               Czerń i biel                              3:27
               Czy o kimś ktoś                           2:17
               Atramentowa rumba                         5:16
               Do rycerzy, do szlachty, do mieszczan     3:22
               Drzwi odemknij                            3:21
               Moje życie, twoje życie                   3:19
               Obfitość                                  3:20
               Jego portret                              3:15
               I znowu on                                3:11
               Nie strasz                                3:55
               Smuteczku mój                             3:44
               Szeptem do mnie mów                       3:33
               Wielka słota                              3:11
               Wakacje z deszczem                        2:59
               Pieśń cygańska                            3:09

有可能吗? 我正在使用转换http://xsltransform.net

还有一件事,我要为一些波兰词道歉,我懒得把一些元素的名称翻译成英文,我知道如果一切都是英文的,文件会更清楚,但最后,这只是关于 xslt 逻辑。提前谢谢你。

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    如果处理子元素,如

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    
        <xsl:template match="text()">
            <xsl:if test="normalize-space(.)">
                <xsl:value-of select="concat(normalize-space(.), '')"/>
            </xsl:if>
            <xsl:apply-templates/>
        </xsl:template>
    
        <xsl:template match="/">
            <xsl:text>TXT&#xA;</xsl:text>
            <xsl:apply-templates />
        </xsl:template>
    
        <xsl:template match="płytoteka">
            <xsl:apply-templates select="bestseller"/>
            <xsl:text>&#xA;</xsl:text>
        </xsl:template>
    
        <xsl:template match="bestseller">
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>BESTSELLER:</xsl:text>
            <xsl:value-of select="concat('&#x9;&#x9;',./@rok,'&#xA;')" />
            <xsl:text>&#xA;</xsl:text>
            <xsl:apply-templates select="płyta"/>
            <xsl:text>&#xA;</xsl:text>
        </xsl:template>
    
        <xsl:template match="płyta">
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>PLYTA:&#xA;</xsl:text>
            <xsl:text>Gatunek:&#x9;</xsl:text>
            <xsl:apply-templates select="gatunek"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Tytul: &#x9;</xsl:text>
            <xsl:apply-templates select="tytuł"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Wykonawca: &#x9;</xsl:text>
            <xsl:apply-templates select="wykonawca"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Data premiery: &#x9;</xsl:text>
            <xsl:apply-templates select="data_premiery"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Cena: &#x9;</xsl:text>
            <xsl:apply-templates select="cena"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Rok nagrania: &#x9;</xsl:text>
            <xsl:apply-templates select="rok_nagrania"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Czas trwania: &#x9;</xsl:text>
            <xsl:apply-templates select="czas_trwania"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Czas od premiery: &#x9;</xsl:text>
            <xsl:apply-templates select="czas_od_premiery"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:apply-templates select="playlista"/>
        </xsl:template>
    
        <xsl:template match="playlista">
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>&#x9;&#x9;UTWORY:&#xA;</xsl:text>
            <xsl:apply-templates select="utwór"/>
            <xsl:text>&#xA;</xsl:text>
        </xsl:template>
    
        <xsl:template match="utwór">
            <xsl:text>&#x9;&#x9;&#9;&#9;</xsl:text>
            <xsl:apply-templates/>
        </xsl:template>
    
        <xsl:template match="utwór/czas">
            <xsl:text>&#9;</xsl:text>
            <xsl:value-of select="."/>
            <xsl:text>&#10;</xsl:text>
        </xsl:template>
    
     </xsl:stylesheet>
    

    那么您至少可以将文本与持续时间分开。 http://xsltransform.net/bnnZWm 的示例。

    如果您使用 XSLT 2.0,那么您可以像 http://xsltransform.net/bnnZWm/1 一样使用库 functx,它确实如此

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:functx="http://www.functx.com">
    
    <xsl:import href="http://www.xsltfunctions.com/xsl/functx-1.0-nodoc-2007-01.xsl"/>
    
    <xsl:output method="text"/>
    
        <xsl:template match="text()">
            <xsl:if test="normalize-space(.)">
                <xsl:value-of select="concat(normalize-space(.), '')"/>
            </xsl:if>
            <xsl:apply-templates/>
        </xsl:template>
    
        <xsl:template match="/">
            <xsl:text>TXT&#xA;</xsl:text>
            <xsl:apply-templates />
        </xsl:template>
    
        <xsl:template match="płytoteka">
            <xsl:apply-templates select="bestseller"/>
            <xsl:text>&#xA;</xsl:text>
        </xsl:template>
    
        <xsl:template match="bestseller">
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>BESTSELLER:</xsl:text>
            <xsl:value-of select="concat('&#x9;&#x9;',./@rok,'&#xA;')" />
            <xsl:text>&#xA;</xsl:text>
            <xsl:apply-templates select="płyta"/>
            <xsl:text>&#xA;</xsl:text>
        </xsl:template>
    
        <xsl:template match="płyta">
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>PLYTA:&#xA;</xsl:text>
            <xsl:text>Gatunek:&#x9;</xsl:text>
            <xsl:apply-templates select="gatunek"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Tytul: &#x9;</xsl:text>
            <xsl:apply-templates select="tytuł"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Wykonawca: &#x9;</xsl:text>
            <xsl:apply-templates select="wykonawca"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Data premiery: &#x9;</xsl:text>
            <xsl:apply-templates select="data_premiery"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Cena: &#x9;</xsl:text>
            <xsl:apply-templates select="cena"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Rok nagrania: &#x9;</xsl:text>
            <xsl:apply-templates select="rok_nagrania"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Czas trwania: &#x9;</xsl:text>
            <xsl:apply-templates select="czas_trwania"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Czas od premiery: &#x9;</xsl:text>
            <xsl:apply-templates select="czas_od_premiery"/>
            <xsl:text>&#xA;</xsl:text>
            <xsl:apply-templates select="playlista"/>
        </xsl:template>
    
        <xsl:template match="playlista">
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>&#x9;&#x9;UTWORY:&#xA;</xsl:text>
            <xsl:apply-templates select="utwór"/>
            <xsl:text>&#xA;</xsl:text>
        </xsl:template>
    
        <xsl:template match="utwór">
            <xsl:text>&#x9;&#x9;&#9;&#9;</xsl:text>
            <xsl:apply-templates/>
        </xsl:template>
    
        <xsl:template match="utwór/text()[1]">
            <xsl:value-of select="functx:pad-string-to-length(., ' ', max(../../utwór/text()[1]/string-length()))"/>
        </xsl:template>
    
        <xsl:template match="utwór/czas">
            <xsl:text>&#9;</xsl:text>
            <xsl:value-of select="."/>
            <xsl:text>&#10;</xsl:text>
        </xsl:template>
    
    
    
     </xsl:stylesheet>
    

    更好地格式化数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      相关资源
      最近更新 更多