Использование XML и XSLT - PullRequest
       13

Использование XML и XSLT

1 голос
/ 29 сентября 2011

Я просто пытаюсь создать пример XML-файла с таблицей стилей XSL.Проблема в том, что, когда я анализирую два файла, я получаю странный вывод.

вот XML:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="mySchema.xsl"?>
<Artists>
  <Artist>
    <BandName>The Cure</BandName>
    <Albums>
      <Album>
        <AlbumTitle>Disintegration</AlbumTitle>
        <Tracks>
          <track>
            <Title>Plain Song</Title>
            <Order>1</Order>
            <Lenght>
              <min>5</min>
              <sec>12</sec>
            </Lenght>
          </track>
          <track>
            <Title>Pictures Of You</Title>
            <Order>2</Order>
            <Lenght>
              <min>7</min>
              <sec>24</sec>
            </Lenght>
          </track>
        </Tracks>
      </Album>
      <Album>
        <AlbumTitle>Wish</AlbumTitle>
        <Tracks>
          <track>
            <Title>A Letter To Elise</Title>
            <Order>4</Order>
            <Lenght>
              <min>5</min>
              <sec>14</sec>
            </Lenght>
          </track>
          <track>
            <Title>From the Edge of the Deep Green Sea</Title>
            <Order>2</Order>
            <Lenght>
              <min>7</min>
              <sec>45</sec>
            </Lenght>
          </track>
        </Tracks>
      </Album>
    </Albums>
  </Artist>

  <Artist>
    <BandName>The Pogues</BandName>
    <Albums>
      <Album>
        <AlbumTitle>If I Should Fall from Grace with God</AlbumTitle>
        <Tracks>
          <track>
            <Title>Fairytale of New York</Title>
            <Order>1</Order>
            <Lenght>
              <min>2</min>
              <sec>20</sec>
            </Lenght>
          </track>
          <track>
            <Title>Sit Down by the Fire</Title>
            <Order>13</Order>
            <Lenght>
              <min>4</min>
              <sec>10</sec>
            </Lenght>
          </track>
        </Tracks>
      </Album>
      <Album>
        <AlbumTitle>Peace And Love </AlbumTitle>
        <Tracks>
          <track>
            <Title>Young Ned Of The Hill</Title>
            <Order>3</Order>
            <Lenght>
              <min>2</min>
              <sec>45</sec>
            </Lenght>
          </track>
          <track>
            <Title>Boat Train</Title>
            <Order>11</Order>
            <Lenght>
              <min>2</min>
              <sec>40</sec>
            </Lenght>
          </track>
        </Tracks>
      </Album>
    </Albums>
  </Artist>
</Artists>

, а вот XSLT-файл:

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="Artist">
    <html>
      <body>
        <xsl:apply-templates select="BandName"/>
        <br></br>
      </body>
    </html>

  </xsl:template>
  <xsl:template match="BandName">
    <b>Found a band!</b>
  </xsl:template>
</xsl:stylesheet>

Когда я рендерим их, используя Visual Studio Ide, я вижукак файл XML преобразован в XHTML.вывод выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
  <html><body><b>Found a band!</b><br /></body></html>

  <html><body><b>Found a band!</b><br /></body></html>

Когда я смотрю на это в браузере, это нормально, но я не рад, как отображается более одного раза.Что я делаю не так?

спасибо Джейсон

Ответы [ 5 ]

1 голос
/ 29 сентября 2011

У вас есть более одного элемента Artist, и совпадение с "select" захватывает их обоих.

1 голос
/ 29 сентября 2011

Ваш шаблон match="Artist" применяется дважды, потому что в исходном документе есть два Artist. Это то, что приводит к двум html элементам в дереве результатов.

Попробуйте использовать эту слегка модифицированную версию таблицы стилей:

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="Artists">
    <html>
      <body>
        <xsl:apply-templates select="Artist"/>
        <br></br>
      </body>
    </html>    
  </xsl:template>

  <xsl:template match="Artist">
    <xsl:apply-templates select="BandName"/>
  </xsl:template>

  <xsl:template match="BandName">
    <b>Found a band!</b>
  </xsl:template>
</xsl:stylesheet>
1 голос
/ 29 сентября 2011

Ваш первый шаблон соответствует нескольким элементам Artist. Для каждого соответствующего элемента Artist он выводит ваше дерево <html><body>...</> в результирующий документ. Вы можете попробовать что-то вроде следующего.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/Artists">
    <html>
      <body>
        <xsl:apply-templates select="Artist/BandName"/>
        <br></br>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="BandName">
    <b>Found a band!</b>
  </xsl:template>

</xsl:stylesheet>
1 голос
/ 29 сентября 2011

Я отредактировал ваш вопрос так, как мне кажется, проблема в том, что body и html tag включаются дважды. Это потому, что вы дважды используете шаблон для Artist. Поскольку шаблон включает теги body и html, они дважды включаются в вывод.

Вам нужно использовать for-each для сопоставления нескольких экземпляров в одном шаблоне. Ниже приведена выдержка из http://www.w3schools.com/ с примером:

<xsl:for-each select="catalog/cd">
    <tr>
        <td><xsl:value-of select="title"/></td>
        <td><xsl:value-of select="artist"/></td>
    </tr>
</xsl:for-each>

Ознакомьтесь с разделом w3school xsl для получения дополнительной информации: http://www.w3schools.com/xsl/

0 голосов
/ 30 сентября 2011

Вероятно, одно из кратчайших возможных решений (не соответствует шаблону Artist):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
  <html>
   <body>
    <xsl:apply-templates/>
   </body>
  </html>
 </xsl:template>

 <xsl:template match="Artist/BandName">
   <b>Found a band!</b><br /><br />
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>
...