2008-09-05 10 views
16

У меня есть простой XML-документ, содержащий информацию об изображении. Мне нужно преобразовать его в HTML - просто, правильно? Однако, когда я использую XSL ниже, он взрывается с ошибкой «Невозможно записать узел атрибута, когда нет начального тега элемента». Я не вижу, где открыт открытый тег - любые идеи?Как вы добавляете изображение?

XML:

 
<root> 
    <HeaderText> 
     <HeaderText>Dan Testing</HeaderText> 
    </HeaderText> 
    <Image> 
     <img width="100" height="100" alt="FPO lady" src="/uploadedImages/temp_photo_small.jpg"/> 
    </Image> 
    <BodyText> 
     <p>This is a test of the body text<br /></p> 
    </BodyText> 
    <ShowLinkArrow>false</ShowLinkArrow> 
</root> 

XSL:

 
<xsl:stylesheet version="1.0" extension-element-prefixes="msxsl" 
    exclude-result-prefixes="msxsl js dl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:js="urn:custom-javascript" xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:dl="urn:datalist"> 
    <xsl:output method="xml" version="1.0" omit-xml-declaration="yes" indent="yes" encoding="utf-8"/> 
    <xsl:template match="/" xml:space="preserve"> 
     <img> 
      <xsl:attribute name="width"> 
       100 
      </xsl:attribute> 
      <xsl:attribute name="height"> 
       100 
      </xsl:attribute> 
      <xsl:attribute name="class"> 
       CalloutRightPhoto 
      </xsl:attribute> 
      <xsl:attribute name="src"> 
       <xsl:copy-of select="/root/Image/node()"/> 
      </xsl:attribute> 
     </img> 
    </xsl:template> 
</xsl:stylesheet> 

ответ

25

Просто чтобы прояснить проблему здесь - ошибка в следующем кусочке коды:

<xsl:attribute name="src"> 
    <xsl:copy-of select="/root/Image/node()"/> 
</xsl:attribute> 

Инструкция XSL: копирование дубли узлов или набор узлов, и делает копию - вывод узел или набор узлов. Однако атрибут не может содержать узел, только текстовое значение, поэтому значение xsl: value-of будет возможным решением (так как это возвращает текстовое значение узла или набора узлов).

гораздо короче раствор (и, возможно, более элегантный) будет следующим:

<img width="100" height="100" src="{/root/Image/node()}" class="CalloutRightPhoto"/> 

Использование {} в атрибуте называется значение атрибута шаблона, и может содержать любое выражение XPATH.

Обратите внимание, что тот же XPath можно использовать здесь, как вы использовали в xsl_copy, так как он знает, чтобы использовать текстовое значение при использовании в Шаблоне значений атрибутов.

+0

Я пытаюсь решить что-то очень похожее. Мне нужно генерировать отчеты слов из приложения PHP для того, что я преобразовываю XML с помощью XSLT. Описанное выше решение работает для создания документов Word 2007? – ivantxo 2011-12-06 01:30:15

3

Ничего - я идиот. Мне просто нужно < XSL: стоимость отборных = "/ корень/Image/узел()"/>

4

Это не должно быть:

<xsl:value-of select="/root/Image/img/@src"/> 

? Похоже, что вы пытаетесь скопировать весь узел Image/IMG атрибуту @src

+0

+1 Это работало для меня. Я не пробовал использовать «/ root/Image/node()», потому что это просто не имеет никакого смысла. – 2010-11-04 17:46:45

3

Для того, чтобы добавить атрибуты, XSL хочет

 
<xsl:element name="img"> 
    (attributes) 
</xsl:element> 

вместо просто

 
<img> 
    (attributes) 
</img> 

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

0

Другой вариант, чтобы попробовать это простой

<img width="100" height="100" src="/root/Image/image.jpeg" class="CalloutRightPhoto"/> 

т.е. без {}, но вместо того, чтобы дать прямой путь к изображению

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