【问题标题】:XSL/XML Issue - Attribute and namespace issueXSL/XML 问题 - 属性和命名空间问题
【发布时间】:2014-11-17 14:44:04
【问题描述】:

我正在使用 ThumbGen 生成电影表。对于我的数字电影。它使用 XSL。我的想法是让“演员”从一个文件夹中加载图片,里面有他们的照片。我在网上搜索,其他人对如何解决同样的问题有疑问。所以我以此为基础,但无法让它发挥作用。

我收到错误: “在添加了文本、注释、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" />

好的,我已将 XSL 文件更新为:

 <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)

谢谢。 -开发

【问题讨论】:

  • 请发布足够的代码 (XML+XSLT) 以便我们重现问题。
  • 这就是所有的 XSL 代码。我可以发布完整的 XML 文件。但由于它是 ThumGen 的模板,我假设没有 ThumGen,您将无法复制它。

标签: xml xslt xml-parsing xslt-1.0


【解决方案1】:

我得到了它的工作:

    <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>

现在我要看看我是否可以让它与演员以外的人一起工作。

【讨论】:

  • 这与您开始时有什么不同?
  • 您添加了属性模板,但您应该显式输出节点或属性的值,因为在文本值上隐含使用内置模板有点混乱。 将完成这项工作,而不是通用嵌套的应用模板。
【解决方案2】:

您需要为属性节点定义模板,否则xslt处理器将使用内置的模板,它将属性值输出为文本节点(see this previous post for details。然后,当您尝试向元素添加属性时,你有几个文本节点之前由所有内置模板添加到属性上。

所以只需添加:

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

您也可以通过以下方式切换&lt;xsl:apply-templates select='@*'/&gt;

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

这将直接完成这项工作。

如果您有更多输入元素,您可能还需要为元素添加默认模板,例如:

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

【讨论】:

  • 谢谢您,我还是有点困惑,我也阅读了您发布的其他链接。但在我试图让它工作时,它说:'select' 是 'xsl:attribute' 元素的无效属性。即使添加了第二部分,即使我的 apply-templates 行更改为包含 select='@* |节点()'也是如此。
  • 奇怪。以前从未检查过规范,但 select 似乎不是 xsl:attribute 元素的常规属性。我应该使用处理器的一些懒惰的一面。你可以使用副本然后(编辑我的答案)。
猜你喜欢
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多