Таблица стилей XSLT, которая преобразует XML в XML (RSS 2.0) - PullRequest
0 голосов
/ 11 февраля 2011

вот что у меня есть:

< ?xml version="1.0"?>  
< xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
< xmlns:g="http://base.google.com/ns/1.0" version="1.0">  
< xsl:output method="RSS 2.0"/>  
< xsl:template match="Description">  
< title>  
< /title>  
< /xsl:template>  
< xsl:template match="Caption">  
< description> 
< /description> 
< /xsl:template> 
< xsl:template match="Url> 
< link>  
< /link>  
< /xsl:template>  
< xsl:template match="Condition">  
< g:condition>  
< /g:condition>  
< /xsl:template>  
< xsl:template match="Picture">  
< g:image_link>  
< /g:image_link>  
< /xsl:template>  
< /xsl:stylesheet>  

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

/Users/subnetfile/Desktop/finalxsltemplate.xslt:4:   
parser   
error :   
error parsing attribute name  
< xmlns:g="http://base.google.com/ns/1.0" version="1.0">  
        ^
/Users/subnetfile/Desktop/finalxsltemplate.xslt:4:   
parser   
error :   
attributes construct error  
< xmlns:g="http://base.google.com/ns/1.0" version="1.0">  
        ^
/Users/subnetfile/Desktop/finalxsltemplate.xslt:4:   
namespace   
error :   
Namespace prefix xmlns on g is not defined  
< xmlns:g="http://base.google.com/ns/1.0" version="1.0">  
        ^
/Users/subnetfile/Desktop/finalxsltemplate.xslt:4:   
parser   
error :   
Couldn't find end of Start Tag g line 4  
< xmlns:g="http://base.google.com/ns/1.0" version="1.0">  
        ^
/Users/subnetfile/Desktop/finalxsltemplate.xslt:20:   
parser   
error :   
Unescaped '<' not allowed in attributes values  
< link>  
^  
/Users/subnetfile/Desktop/finalxsltemplate.xslt:20:   
parser   
error :   
attributes construct error  
< link>  
^  
/Users/subnetfile/Desktop/finalxsltemplate.xslt:20:   
parser   
error :   
Couldn't find end of Start Tag template line 19  
< link>  
^  
/Users/subnetfile/Desktop/finalxsltemplate.xslt:22:   
parser   
error :   
Opening and ending tag mismatch: stylesheet line 2 and template  
< /xsl:template>  
               ^
/Users/subnetfile/Desktop/finalxsltemplate.xslt:24:   
parser   
error :   
Extra content at the end of the document  
< xsl:template match="Condition">  
^  
error  
xsltParseStylesheetFile : cannot parse /Users/subnetfile/Desktop/finalxsltemplate.xslt  
(null)  

Правильно ли я понимаю, что мне действительно нужно использовать только функцию 'match', поскольку все элементы просто имеют один подуровень атрибутов без значений атрибутов или чего-то подобного.
Кроме того, поля в конечном продукте ДОЛЖНЫ иметь соответствующие значения в исходном файле, или они могут быть вставлены для каждого элемента. например, для окончательного формата необходимо поле с именем payment_accepted и поле для соответствия отсутствует, но я просто хотел бы добавить одно и то же значение для каждого элемента, например Visa. Могу ли я вместо «match» использовать что-то вроде «foreach»?

РЕДАКТИРОВАТЬ:

< xsl:stylesheet  
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
     xmlns:g="http://base.google.com/ns/1.0"  
    version="1.0">  

  < xsl:output method="RSS 2.0"/>  
  < xsl:template match="*[local-name()='title']">  
    < xsl:text>title: </xsl:text>  
    < xsl:apply-templates/>  
  < /xsl:template>  

  < xsl:template match="*[local-name()='link']">  
    < xsl:text>link: </xsl:text>  
    < xsl:apply-templates/>  
  < /xsl:template>  

  < xsl:template match="*[local-name()='description']">  
    < xsl:text>description: </xsl:text>  
    < xsl:apply-templates/>  
  < /xsl:template>  


  < xsl:template match="language"/>  < !-- suppress -->  

< /xsl:stylesheet>  

Это начинает что-то делать, но мне нужна другая подсказка, пожалуйста.

EDIT:
Я сделал некоторый прогресс и сделал что-то, что делает что-то правильно:

< xsl:stylesheet  
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
     xmlns:g="http://base.google.com/ns/1.0"  
    version="1.0">  

  < xsl:output method="text"/>  

  < xsl:template match="Description">  
    < xsl:text>title: </xsl:text>  
    < xsl:apply-templates/>  
  < /xsl:template>  

  < xsl:template match="Url">  
    < xsl:text>link: </xsl:text>  
    < xsl:apply-templates/>  
  < /xsl:template>  

  < xsl:template match="Caption">  
    < xsl:text>description: </xsl:text>  
    < xsl:apply-templates/>  
  < /xsl:template>  


  < xsl:template match="language"/>  < !-- suppress -->  

< /xsl:stylesheet>  

и это работает без ошибок отладки, это не совсем то, что мне нужно, как бы я добавил атрибуты пространства имен Google, которые используют xlmnsg..etc, и некоторые атрибуты, которые не имеют соответствующих значений в файле XML, как я просто хочу назначить одно и то же g: условие 'new' каждому узлу (верно ли, что каждый элемент здесь называется узлом?)

1 Ответ

1 голос
/ 11 февраля 2011

В тексте есть много формальных ошибок, которые вы указываете как "таблица стилей XSLT":

  • левые угловые скобки любого начального тега не выполняются немедленнопо имени.

  • Это неправильно сформированный XML:

<xmlns:g="http://base.google.com/ns/1.0"

version = "1.0">

Здесь есть две ошибки :

  • Имя xmlns:g недопустимо, поскольку префикс пространства имен не должен начинаться с зарезервированногослово "xml".

  • За именем элемента не может следовать непробельный символ (в данном случае =).

Это выглядит как объявление пространства имен и не должно кодироваться как нечто, похожее на элемент.

<xsl:template match="Url>
<link>
</link>
</xsl:template>
<xsl:template match="Condition">

Вторая кавычка, которая должна содержать значение атрибута match, отсутствуетпоэтому все, что находится между первой кавычкой в ​​первой строке и первой кавычкой в ​​последней строке, считается значением атрибута ...

Даже когда все эти ошибки исправлены и таблица стилей теперь выглядит следующим образом:

<xsl:stylesheet
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:g="http://base.google.com/ns/1.0"
    version="1.0">

  <xsl:output method="RSS 2.0"/>
  <xsl:template match="Description">
      <title>    </title>
  </xsl:template>
  <xsl:template match="Caption">
      <description>    </description>
  </xsl:template>
  <xsl:template match="Url">
      <link>    </link>
  </xsl:template>
  <xsl:template match="Condition">
      <g:condition>    </g:condition>
  </xsl:template>
  <xsl:template match="Picture">
      <g:image_link>    </g:image_link>
  </xsl:template>
</xsl:stylesheet>

этот код является довольно бессмысленным.На самом деле он не обрабатывает исходный XML-файл и не выводит из него никакого содержимого в результирующий вывод.

Я рекомендую вам прочитать хотя бы небольшое руководство по XSLT итолько когда у вас есть базовые знания, чтобы начать писать код.

...