Мой xslt не выдает правильный вывод? - PullRequest
0 голосов
/ 04 января 2011

Мой XML - это 'input.xsl'

      <?xml version="1.0" encoding="ISO-8859-1"?>
     <?xml-stylesheet type="text/xsl" href="input.xsl"?>
      <catalog>
     <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
    </cd>
    <cd>
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <country>UK</country>
    <company>CBS Records</company>
    <price>9.90</price>
    <year>1988</year>
    </cd>
       </catalog>

Теперь я хочу сгенерировать другой XML-документ, используя приведенный выше XML-файл, с помощью XSLT следующим образом (формат OUTPUT)

        <?xml version="1.0" encoding="ISO-8859-1"?>
        <catalog>
        <cd>
       <title>Empire Burlesque</title>
       <artist>Bob Dylan</artist>
        </cd>
        <cd>
       <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
        </cd>
          </catalog>

Для этого я создаю файл xsl, 'input.xsl'

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

    <xsl:template match="/">
        <xsl:element name="catalog">
            <xsl:apply-templates select="catalog/cd/title"/> <br/>
            <xsl:apply-templates select="catalog/cd/artist"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="catalog/cd/artist">
        <xsl:element name="cd">
            <xsl:value-of select="current()"/> 
        </xsl:element>
    </xsl:template>

    <xsl:template match="catalog/cd/title">
        <xsl:element name="cd">
            <xsl:value-of select="current()"/> 
        </xsl:element>
    </xsl:template>
  </xsl:stylesheet>

Приведенный выше файл xsl не производит вывод в формате xml.так в чем проблема в моем коде.Веди меня.Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 04 января 2011

На самом деле, я не думал, что вам понадобится все это соответствие шаблону. Кажется, это усложняет задачу, потому что контекст каждый раз меняется.

Я бы просто сопоставил корень и сделал бы for-each для элемента cd. Кажется, все гораздо проще, я думаю, вы поймете это, прочитав это; -)

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

    <xsl:template match="/">
        <catalog>
            <xsl:for-each select="catalog/cd">
                <cd>
                    <title><xsl:value-of select="title"/></title>
                    <artist><xsl:value-of select="artist"/></artist>
                </cd>
            </xsl:for-each>
        </catalog>
    </xsl:template>
</xsl:stylesheet>
1 голос
/ 04 января 2011

Другой подход, использующий шаблон преобразования идентичности.

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

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

<xsl:template match="country | company | price | year | processing-instruction()"/>

</xsl:stylesheet>

Применительно к образцу XML получен правильный результат:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
    </cd>
    <cd>
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
    </cd>
</catalog>
1 голос
/ 04 января 2011

Вы используете пути, которым вы хотите соответствовать, в предложении select вашего вызова.Помните, что при сопоставлении каждого узла он становится узлом current , из которого оцениваются любые последующие относительные выражения XPath.Кроме того, вам не нужно создавать элементы постоянно - просто поместите «шаблонный» XML туда, где вы хотите.

Я предлагаю вместо этого:

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

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

<xsl:template match="artist">
    <artist><xsl:value-of select="text()" /></artist>
</xsl:template>

<xsl:template match="title">
    <title><xsl:value-of select="text()" /></title>
</xsl:template>

Я не могупомните, если text () - правильная вещь, но это может заставить вас двигаться в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...