2008-09-05 42 views
16

Tôi có một tài liệu XML đơn giản chứa thông tin hình ảnh. Tôi cần phải biến nó thành HTML - đơn giản, đúng không? Tuy nhiên, khi tôi sử dụng XSL bên dưới, nó sẽ thổi lên với lỗi "Không thể ghi nút thuộc tính khi không có thẻ bắt đầu phần tử nào được mở." Tôi không thể thấy vị trí của thẻ mở - bất kỳ ý tưởng nào?Làm cách nào để thêm hình ảnh?

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> 

Trả lời

25

Chỉ cần làm rõ các vấn đề ở đây - có sai số trong các bit mã sau đây:

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

Các hướng dẫn xsl: copy-of mất một nút hoặc nút thiết lập và tạo ra một bản sao của nó - xuất ra một nút hoặc tập hợp nút. Tuy nhiên một thuộc tính không thể chứa một nút, chỉ có một giá trị văn bản, vì vậy xsl: value-of sẽ là một giải pháp có thể (vì điều này trả về giá trị văn bản của một nút hoặc nút nodeset).

Một giải pháp NHIÊU ngắn hơn (và có lẽ tao nhã hơn) sẽ là như sau:

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

Việc sử dụng {} trong các thuộc tính được gọi là một thuộc tính Value Template, và có thể chứa bất kỳ biểu hiện XPATH.

Lưu ý, cùng XPath có thể được sử dụng ở đây như bạn đã sử dụng trong xsl_copy-of vì nó biết lấy giá trị văn bản khi được sử dụng trong Mẫu giá trị thuộc tính.

+0

Tôi đang cố gắng giải quyết một cái gì đó rất giống nhau. Tôi cần tạo các báo cáo từ từ một ứng dụng PHP cho những gì tôi đang chuyển đổi XML bằng XSLT. Liệu các giải pháp trên làm việc để tạo ra các tài liệu từ 2007? – ivantxo

+0

Không, ở trên không phải để tạo tài liệu từ, mà chỉ đơn giản là để tạo một thẻ từ đầu vào XML đã cho. Nếu bạn muốn tạo các tài liệu Word bằng XSLT thì chúc may mắn, vì nó rất phức tạp. – samjudson

3

Đừng bận tâm - Tôi là một thằng ngốc. Tôi chỉ cần < xsl: value-of select = "/ root/hình ảnh/nút()"/>

4

nên không có được:

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

? Có vẻ như bạn đang cố gắng sao chép toàn bộ nút Hình ảnh/img vào thuộc tính @src

+0

1 này đã làm việc cho tôi. Tôi đã không thử với "/ root/Image/node()" bởi vì điều đó dường như không có ý nghĩa gì cả. –

3

Để thêm các thuộc tính, XSL muốn

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

thay vì chỉ

 
<img> 
    (attributes) 
</img> 

Mặc dù, vâng, nếu bạn chỉ sao chép phần tử như là, bạn không cần bất kỳ thứ gì.

0

Các tùy chọn khác để thử là một đơn giản

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

nghĩa là không phải {} nhưng thay vì đưa ra các con đường hình ảnh trực tiếp

Các vấn đề liên quan