2015-10-07 3 views
1

У меня возникли проблемы с тем, чтобы мой шаблон совпадал с работой, я пытаюсь выполнить итерацию по каждому из атрибутов, используя сопоставление шаблонов, вместо выражения xsl: for-each.руководство по оформлению шаблона xslt

Вот файл XML

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<?xml-stylesheet type="text/xsl" href="template.xslt"?> 
<x:recording xmlns:x="http://www.example.com/xmlns/record20080320" x:ref="889002005990000" x:version="11.0"> 


    <x:finalized>true</x:finalized> 

    <x:segment> 
    <x:contenttype>mp3</x:contenttype> 
    <x:starttime>2015-07-26T19:15:48.327+04:00</x:starttime> 
    <x:attributes> 
     <x:tag x:timestamp="2015-07-26T19:15:48.719+04:00"> 
     <x:attribute x:key="ref">123456</x:attribute> 
     </x:tag> 
     <x:tag x:timestamp="2015-07-26T19:15:48.719+04:00"> 
     <x:attribute x:key="genre">rock</x:attribute> 
     </x:tag> 
     <x:tag x:timestamp="2015-07-26T19:15:48.719+04:00"> 
     <x:attribute x:key="artist">Anees CK</x:attribute> 
     </x:tag> 
    </x:attributes> 
    <x:systemtype>Windows</x:systemtype> 
    <x:multipart> 
     <x:primary>889002005990000</x:primary> 
    </x:multipart> 
    <x:duration>6</x:duration> 
    </x:segment> 

</x:recording> 

И это мой шаблон,

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:x="http://www.example.com/xmlns/record20080320" > 
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" /> 
<xsl:template match="x:recording"> 
    <Call xmlns:xsi="http://www.w3.org/20001/XMLSchema-instance"> 
     <Data> 
      <finalized> 
       <xsl:value-of select="x:finalized"/> 
      </finalized> 
      <test111> 
       <xsl:text>some text</xsl:text> 
      </test111> 
      <contenttype> 
       <xsl:value-of select="x:segment/x:contenttype"/> 
      </contenttype> 
      <sometag> 
       <xsl:value-of select="x:segment/x:attributes/x:tag/x:attribute"/> 
      </sometag> 

      <xsl:template match="x:attributes"> 
       <xsl:text>found attribute</xsl:text>   
      </xsl:template> 

     </Data> 
    </Call> 
</xsl:template> 
</xsl:stylesheet> 

Может кто-нибудь увидеть, что я делаю неправильно? Спасибо заранее.

+0

Шаблоны не могут быть вложенными. Каков результат, который вы ищете? –

ответ

1

Возможно, вы хотели этого:

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:x="http://www.example.com/xmlns/record20080320" > 
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" /> 
<xsl:template match="x:recording"> 
    <Call xmlns:xsi="http://www.w3.org/20001/XMLSchema-instance"> 
     <Data> 
      <finalized> 
       <xsl:value-of select="x:finalized"/> 
      </finalized> 
      <test111> 
       <xsl:text>some text</xsl:text> 
      </test111> 
      <contenttype> 
       <xsl:value-of select="x:segment/x:contenttype"/> 
      </contenttype> 
      <sometag> 
       <xsl:value-of select="x:segment/x:attributes/x:tag/x:attribute"/> 
      </sometag> 
      <xsl:apply-template select="x:attributes"/> 

     </Data> 
    </Call> 
</xsl:template> 

<xsl:template match="x:attributes"> 
    <xsl:text>found attribute</xsl:text>   
</xsl:template> 

</xsl:stylesheet> 

(Это мне потребовалось некоторое время, чтобы понять, что, когда вы используете термин «атрибуты», вы не имели в виду атрибуты XML, вы имеете в виду элементы, имя "х: атрибут").

+1

' Или я? ' – kjhughes

+0

Спасибо, Майкл, но я пробовал это, и он не работает. В идеале я хочу перебирать элементы под атрибутами x: а затем фильтровать некоторые из них, например, только выбрать жанр. – Chris

+0

Что именно вы пытались и как это случилось? Я не пытался показать вам полное решение: я просто показывал вам, где положить объявление 'xsl: template' и объявление' xsl; apply-templates'. –

Смежные вопросы