使用XSLT-diplay从XML创建XML所有元素

时间:2015-12-04 17:28:54

标签: xml xslt

我想使用XSLT从XML创建XML文件。一开始我想显示所有名为“track”的元素,我想用XML格式显示它。

这是我的XML文件                

<document>
<recordlist>
    <bestseller year="2015">
        <plate id="p01" kind="Pop&amp;Rock">
            <title>Atramentowa</title>
            <performer>Celińska Stanisława</performer>
            <release_date>2015-05-08</release_date>
            <distributor idref="d1" />
            <price currency="PLN">37,49</price>
            <year_recorded>2015</year_recorded>
            <availability mp3="1" cd="0" dvd="1" />
            <playlist id="pl01" nazwa="Atramentowa">
                <track id="p01u01">Czerń i biel<czas>3:27</czas></track>
                <track id="p01u02">Czy o kimś ktoś<czas>2:17</czas></track>
                <track id="p01u03">Atramentowa rumba<czas>5:16</czas></track>
                <track id="p01u04">Do rycerzy, do szlachty, do mieszczan<czas>3:22</czas></track>
                <track id="p01u05">Drzwi odemknij<czas>3:21</czas></track>
                <track id="p01u06">Moje życie, twoje życie<czas>3:19</czas></track>
                <track id="p01u07">Obfitość<czas>3:20</czas></track>
                <track id="p01u08">Jego portret<czas>3:15</czas></track>
                <track id="p01u09">I znowu on<czas>3:11</czas></track>
                <track id="p01u10">Nie strasz<czas>3:55</czas></track>
                <track id="p01u11">Smuteczku mój<czas>3:44</czas></track>
                <track id="p01u12">Szeptem do mnie mów<czas>3:33</czas></track>
                <track id="p01u13">Wielka słota<czas>3:11</czas></track>
                <track id="p01u14">Wakacje z deszczem<czas>2:59</czas></track>
                <track id="p01u15">Pieśń cygańska<czas>3:09</czas></track> </playlist>
        </plate>
</bestseller>
</recordlist>
</document>

我试图在每个“播放列表”中显示所有元素“track”,但总是有错误的效果,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<document>
<recordlist>
  <bestseller>
     <year>2015</year>
     <plate>
        <kind>Pop&amp;Rock</kind>
        <title>Atramentowa</title>
        <performer>Celińska Stanisława</performer>
        <release_date>2015-05-08</release_date>
        <price>37,49</price>
        <year_recorded>2015</year_recorded>
        <playlist>
           <track />
           <track />
           <track />
           <track />
           <track />
           <track />
           <track />
           <track />
           <track />
           <track />
           <track />
           <track />
           <track />
           <track />
           <track />
        </playlist>
     </plate>
  </bestseller>
  </recordlist>
  </document>

我希望看到每首曲目的名称。

这是我到目前为止所做的,在xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet  
version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times" 
extension-element-prefixes="date"
xmlns:math="http://www.exslt.org/math">

 <xsl:output method="xml" version="1.0" encoding="UTF-8" media-      type="text/xml" 
          omit-xml-declaration="no" indent="yes" />

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

<xsl:template match="node/@TEXT | text()">
<xsl:if test="normalize-space(.)">
  <xsl:value-of select="concat(normalize-space(.), '&#10;')"/>
</xsl:if>
<xsl:apply-templates />
</xsl:template>

<xsl:template match="//recordlist">
  <xsl:element name="recordlist">
      <xsl:apply-templates select="bestseller"/>
  </xsl:element>
</xsl:template>

<xsl:template match="//bestseller">
  <xsl:element name="bestseller">
      <xsl:element name="year">
          <xsl:value-of select="./@year"/>
      </xsl:element>
      <xsl:apply-templates select="plate"/>
  </xsl:element>
</xsl:template>

<xsl:template match="//plate">
  <xsl:element name="plate">
    <xsl:element name="kind">
        <xsl:value-of select="./@kind"/>
    </xsl:element>
    <xsl:element name="title">
        <xsl:value-of select="./title"/>
    </xsl:element>
    <xsl:element name="performer">
        <xsl:value-of select="./performer"/>
    </xsl:element>
    <xsl:element name="release_date">
        <xsl:value-of select="./release_date"/>
    </xsl:element>
    <xsl:element name="price">
        <xsl:value-of select="./price"/>
    </xsl:element>
    <xsl:element name="year_recorded">
        <xsl:value-of select="./year_recorded"/>
    </xsl:element>
    <xsl:apply-templates select="playlist"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="//playlist">
  <xsl:element name="playlist">
    <xsl:for-each select="track">
        <xsl:element name="track">
            <xsl:value-of select="./track"/>
        </xsl:element>
    </xsl:for-each>
  </xsl:element>
  </xsl:template>

  </xsl:stylesheet>

如果有人知道怎么做,我将非常感激。

1 个答案:

答案 0 :(得分:0)

您需要更改:

<xsl:for-each select="track">
    <xsl:element name="track">
        <xsl:value-of select="./track"/>
    </xsl:element>
</xsl:for-each>

为:

<xsl:for-each select="track">
    <xsl:element name="track">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:for-each>

---添加---
或者,如果您还想要包含czas元素:

<xsl:for-each select="track">
    <xsl:element name="track">
        <xsl:copy-of select="node()"/>
    </xsl:element>
</xsl:for-each>

除此之外,我相信您可以将样式表缩短为:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="@* | *[not(node())]"/>

<xsl:template match="/document">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="bestseller/@year | plate/@kind">
     <xsl:element name="{name()}">
          <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>