Использование XSLT в XML-файле - PullRequest
1 голос
/ 09 сентября 2011

Я использую Visual Studio 2010, и у меня есть простой файл XML, который содержит данные, такие как

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="XmlStyle.xslt"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
</catalog>

, и мой файл XSLT содержит данные, такие как

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@* | node()">
      <html>
        <body>
          <h2>My CD Collection</h2>
          <table border="1">
            <tr bgcolor="#9acd32">
              <th>Title</th>
              <th>Artist</th>
            </tr>
            <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>
          </table>
        </body>
      </html>
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

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

My CD CollectionTitleArtistMy CD CollectionTitleArtistMy CD CollectionTitleArtist
  My CD CollectionTitleArtistMy CD CollectionTitleArtist
    My CD CollectionTitleArtistMy CD CollectionTitleArtistEmpire BurlesqueMy CD CollectionTitleArtist
    My CD CollectionTitleArtistMy CD CollectionTitleArtistBob DylanMy CD CollectionTitleArtist
    My CD CollectionTitleArtistMy CD CollectionTitleArtistUSAMy CD CollectionTitleArtist
    My CD CollectionTitleArtistMy CD CollectionTitleArtistColumbiaMy CD CollectionTitleArtist
    My CD CollectionTitleArtistMy CD CollectionTitleArtist10.90My CD CollectionTitleArtist
    My CD CollectionTitleArtistMy CD CollectionTitleArtist1985My CD CollectionTitleArtist
  My CD CollectionTitleArtist

Что я должен сделать, чтобы получить правильный результат?

Ответы [ 2 ]

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

Странный результат, но таблица стилей гораздо более странная. Использование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output indent="yes"/>

        <xsl:template match="/">
      <html>
        <body>
          <h2>My CD Collection</h2>
          <table border="1">
            <tr bgcolor="#9acd32">
              <th>Title</th>
              <th>Artist</th>
            </tr>
            <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>
          </table>
        </body>
      </html>
    </xsl:template>
</xsl:stylesheet>

Этот шаблон создает правильную таблицу при использовании с совместимым процессором XSLT. Также обратите внимание, что правильно использовать XML в качестве метода вывода, даже если вы хотите использовать html. Но вы можете опустить его, так как XML является методом вывода по умолчанию.

Также убедитесь, что вы используете шаблон правила шаблона. Пример:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <html>
            <body>
                <h2>My CD Collection</h2>
                <table border="1">
                    <tr bgcolor="#9acd32">
                        <th>Title</th>
                        <th>Artist</th>
                    </tr>
                    <xsl:apply-templates />
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="catalog/cd">
        <tr>
            <xsl:apply-templates select="title|artist"/>
        </tr>
    </xsl:template>

    <xsl:template match="title|artist">
        <td>
            <xsl:value-of select="."/>
        </td>
    </xsl:template>

</xsl:stylesheet>
0 голосов
/ 09 сентября 2011

Метод вывода - XML. Измените его на HTML:

<xsl:output method="html" indent="yes"/>

Это должно быть так:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="html" indent="yes"/>      
    <xsl:template match="/"> 
      <html> 
        <body> 
          <h2>My CD Collection</h2> 
          <table border="1"> 
            <tr bgcolor="#9acd32"> 
              <th>Title</th> 
              <th>Artist</th> 
            </tr> 
            <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> 
          </table> 
        </body> 
      </html>
    </xsl:template>  
</xsl:stylesheet>  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...