2008-09-05 73 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表達式。

請注意,這裏可以使用與您在xsl_copy-of中使用的XPath相同的XPath,因爲它知道在屬性值模板中使用時會使用文本值。

+0

我試圖解決一些非常相似的問題。我需要從PHP應用程序生成Word報告,以瞭解我使用XSLT轉換XML的情況。上述解決方案是否可以生成Word 2007文檔? – ivantxo 2011-12-06 01:30:15

3

沒關係 - 我是個白癡。我只需要 <的xsl:value-of的選擇= 「/根/圖像/節點()」/ >

4

不應該認爲是:

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

?它看起來像你正試圖將整個圖像/ 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"/> 

即無需{}而是給予直接的圖像路徑