2014-11-17 3 views
0

Я использую ThumbGen для генерации листов фильма. Для моих цифровых фильмов. Он использует XSL. и моя идея состояла в том, чтобы заставить его взять «актеров» и загрузить изображение из папки с их фотографиями. Я искал в Интернете, и у кого-то был вопрос о том, как исправить проблему, делая то же самое. Поэтому я использовал это в качестве основы, но не смог заставить его работать.Проблема XSL/XML - проблема с атрибутом и пространством имен

Я получаю сообщение об ошибке: «Узлы атрибутов и пространства имен не могут быть добавлены к родительскому элементу после добавления текста, комментария, узла pi или подэлемента».

В моей попытке получить эту работу я нашел это:

https://social.msdn.microsoft.com/Forums/en-US/f83fa128-2d0d-4bdc-bfe1-26fbaf6159c7/xsl-and-xml-with-thumbgen

И используя то, что его «исправление», что было сказано ему, дает мне ошибку, он имел перед исправлением , Я работал над этим на прошлой неделе. но я никогда не слышал об XSL до этого. Может ли кто-нибудь увидеть, может быть, что с этим не так?

Но вот строка в XML-файле:

<ImageElement Name="Actor1" X="980" Y="44" Width="93" Height="123" Source="File" Offset="0" MultiPageIndex="-1" SourceData="" NullImageUrl="%PATH%\..\Common\cast\NoPhotoAvailable.jpg" /> 

Ok Я обновил файл XSL To:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:variable name="pathvalue" select="//tokens/token[@name='%PATH%']"/> 
    <xsl:variable name="folderactors" select="string('\..\Common\cast\')"/> 
    <xsl:variable name="actorsext" select="string('.jpg')"/> 
    <xsl:variable name="actorstext" select="string('')"/> 
    <xsl:variable name="lista1" select="//tokens/token[@name='%ACTORS%']"/> 
    <xsl:variable name="actor1" select="substring-before($lista1, ',')" /> 
    <xsl:variable name="resto1" select="substring-after($lista1, ',')" /> 
    <xsl:variable name="lista2" select="$resto1"/> 
    <xsl:variable name="actor2" select="substring-before($lista2, ',')" /> 
    <xsl:template match="ImageElement[@Name='Actor1']"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:choose> 
       <xsl:when test="$actor1 != '' "> 
        <xsl:attribute name="SourceData"> 
         <xsl:value-of select="concat($pathvalue,$folderactors,$actor1,$actorsext)"/> 
        </xsl:attribute> 
       </xsl:when> 
      </xsl:choose> 
      <xsl:apply-templates select="node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

А теперь я получаю сообщение об ошибке:

1: 2014-11-17 09:18:00.1842 [RenderMoviesheet] Entering rendermoviesheet 

1: 2014-11-17 09:18:00.1842 [RenderMoviesheet] Needs render 

1: 2014-11-17 09:18:00.1842 [RenderMoviesheet] Start analyze template 

1: 2014-11-17 09:18:00.5332 [RenderMoviesheet] End analyze template 

1: 2014-11-17 09:18:01.2673 [RenderMoviesheet] Rendering using Clear Showcase; 

thumbmode=True; done in 732.0419ms; file= filename.avi 

1: 2014-11-17 09:18:01.2673 [RenderMoviesheet] Saving small preview 

1: 2014-11-17 09:18:01.2733 [CreateThumbnailImage] Resizing C:\Users\Dev\AppData\Local\Temp\_thumbgen_tmp\171b3083-e6b7-4ec9-9ea2-1b54b8a8c14d.jpg to C:\Users\Dev\AppData\Local\Temp\_thumbgen_tmp\633c815b-afe3-432c-ba27-a7fb90c43f7f.jpg 

1: 2014-11-17 09:18:01.3173 [RenderMoviesheet] Small preview saved 

1: 2014-11-17 09:18:03.3764 [RenderMoviesheet] Entering rendermoviesheet 

1: 2014-11-17 09:18:03.3774 [RenderMoviesheet] Needs render 

1: 2014-11-17 09:18:03.3774 [RenderMoviesheet] Start analyze template 

1: 2014-11-17 09:18:03.7614 [RenderMoviesheet] End analyze template 

1: 2014-11-17 09:18:03.7614 [RenderMoviesheet] XSL Found 

1: 2014-11-17 09:18:03.8174 [RenderMoviesheet] XSL Processed 

1: 2014-11-17 09:18:03.8174 [RenderMoviesheet] Exception loading template:Invalid XML data for restoring ImageDraw object. 

<?xml version="1.0" encoding="utf-8"?> 

<ImageElement Name="" X="" Y="" Width="" Height="" Source="" Offset="" MultiPageIndex="" NullImageUrl="" SourceData="C:\Users\Dev\Desktop\ThumGen\Templates\Clemery's Ultimate MOVIE SHEET\..\Common\cast\Nicole Kidman.jpg" /> 

1: 2014-11-17 09:18:03.8174 [RenderMoviesheet] render System.Exception: Invalid XML data for restoring ImageDraw object. 

    at ThumbGen.MovieSheets.MovieSheetsGenerator.RenderMoviesheet(Boolean getThumbnail) 

Thank you. -dev

+0

Пожалуйста, разместите достаточно кода (XML + XSLT), который позволит нам воспроизвести проблему. –

+0

- это все код XSL. Я могу опубликовать полный XML-файл. но поскольку это шаблон для ThumGen, я бы предположил, что без ThumGen вы не сможете воспроизвести его. – Dev

ответ

0

Вы должны определить шаблон для узлов атрибутов, или процессор XSLT будет использовать встроенный в одном, который просто вывести значение атрибута в качестве текстового узла (see this previous post for details. Затем, при попытке добавить атрибут ваш элемент, у вас есть несколько текстовых узлов добавлены ранее всех встроенных шаблонов атрибутов

Так просто добавить:.

<xsl:template match="@*"> 
     <xsl:attribute name="{name()}" select="."/> 
</xsl:template> 

вы также можете просто переключить <xsl:apply-templates select='@*'/> по:

<xsl:copy-of select="@*"/> 

Который сделает работу напрямую.

Если у вас есть входы элементов, возможно, потребуется добавить шаблон по умолчанию для элементов тоже один, как:

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

Спасибо, я все еще немного смущен, я прочитал эту другую ссылку, которую вы опубликовали. Но в моих попытках заставить его работать, он говорит: «select» - недопустимый атрибут для элемента «xsl: attribute». , даже со второй добавленной частью, и даже с моей линией apply-templates изменилась на include select = '@ * | node() '. – Dev

+0

Странно. Никогда не проверялся в спецификации раньше, но выбор кажется не регулярным атрибутом для элементов xsl: attribute. Я должен использовать некоторую ленивую сторону моего процессора. Тогда вы можете использовать копию (отредактировал мой ответ). –

0

я получил его работать:

<xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="ImageElement[@Name='Actor1']"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:choose> 
       <xsl:when test="$actor1 != '' "> 
        <xsl:attribute name="SourceData"> 
         <xsl:value-of select="concat($pathvalue,$folderactors,$actor1,$actorsext)"/> 
        </xsl:attribute> 
       </xsl:when> 
      </xsl:choose> 
      <xsl:apply-templates select="node()"/> 
      </xsl:copy> 

    </xsl:template> 
</xsl:stylesheet> 

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

+0

Как это отличается от того, что вам нужно было начинать? –

+0

Вы добавили шаблон атрибута, но вы должны явно выводить значение узлов или атрибутов, так как это немного запутывает использование встроенного шаблона неявно по текстовым значениям. Будет выполнять задание вместо общих вложенных шаблонов заявок. –

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