2010-10-14 27 views
11

tôi cần phải hiển thị HTML-yếu tố trong ý kiến ​​(ví dụ)yếu tố đầu ra trong ý kiến ​​

<!-- <img src="path" width="100px" height="100px"/> --> 

tôi sử dụng phương pháp này

<?xml version="1.0" encoding="windows-1251"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" indent="no" encoding="windows-1251"/> 

    <xsl:template match="myNode"> 
     ... 
     <xsl:comment><xsl:apply-templates select="image" /></xsl:comment> 
     ... 
    </xsl:template> 

    <xsl:template match="image"> 
     <img src="{@src}" width="{@width}px" height="{@height}px" /> 
    </xsl:template> 

</xsl:stylesheet> 

Kết quả là:

<!----> 

rằng là mã trong phần tử xsl:comment bị bỏ qua.

Làm cách nào để hiển thị một mục trong nhận xét?

+0

Câu hỏi hay, +1. Xem câu trả lời của tôi cho một lời giải thích chi tiết và ba cách tiếp cận có thể, tùy thuộc vào nhiệm vụ cụ thể. –

+0

Tôi vừa chỉnh sửa câu trả lời của mình và nghĩ rằng bây giờ nó có giải pháp mà bạn muốn. Có phải vậy không? –

Trả lời

10

Nó có thể là có thể thay thế

<xsl:comment><xsl:apply-templates select="image" /></xsl:comment>

với

<xsl:text disable-output-escaping="yes">&lt;!--</xsl:text>
<xsl:apply-templates select="image" />
<xsl:text disable-output-escaping="yes">--&gt;</xsl:text>

Đã không cố gắng mặc dù.

1

Từ http://www.w3.org/TR/xslt#section-Creating-Comments:

Các xsl: element bình luận được khởi tạo để tạo ra một nút bình luận trong cây kết quả. Nội dung của phần tử xsl: comment là một mẫu cho chuỗi-giá trị của nút nhận xét.

Ví dụ, đây

<xsl:comment>This file is automatically generated. Do not edit!</xsl:comment>

sẽ tạo ra những nhận xét

<!--This file is automatically generated. Do not edit!-->

Đây là một lỗi nếu instantiating nội dung của xsl: comment tạo nút khác hơn các nút văn bản. Bộ xử lý XSLT có thể báo hiệu lỗi; nếu nó không báo hiệu lỗi, nó phải khôi phục bằng cách bỏ qua các vi phạm vi phạm cùng với nội dung của chúng.

Đây là một lỗi nếu kết quả của instantiating nội dung của xsl: comment chứa chuỗi -- hoặc kết thúc với -. Bộ xử lý XSLT có thể báo hiệu lỗi; nếu không báo lỗi, nó phải khôi phục bằng cách chèn khoảng trắng sau khi bất kỳ sự cố nào xảy ra của - theo sau là - hoặc kết thúc nhận xét đó.

Vì vậy, để thực hiện những gì bạn muốn, bạn cần sử dụng cơ chế DOE.

Một ví dụ, kiểu này:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
exclude-result-prefixes="msxsl"> 
    <xsl:output method="html" indent="no" encoding="windows-1251"/> 
    <xsl:template match="img"> 
     <img src="{.}"/> 
    </xsl:template> 
    <xsl:template match="root"> 
     <xsl:variable name="vResult"> 
      <xsl:apply-templates/> 
     </xsl:variable> 
     <html> 
      <xsl:copy-of select="$vResult"/> 
      <xsl:comment> 
       <xsl:apply-templates select="msxsl:node-set($vResult)" 
            mode="encode"/> 
      </xsl:comment> 
     </html> 
    </xsl:template> 
    <xsl:template match="*" mode="encode"> 
     <xsl:value-of select="concat('&lt;',name())" 
         disable-output-escaping="yes"/> 
     <xsl:apply-templates select="@*" mode="encode"/> 
     <xsl:text>></xsl:text> 
     <xsl:apply-templates mode="encode"/> 
     <xsl:value-of select="concat('&lt;',name(),'>')" 
         disable-output-escaping="yes"/> 
    </xsl:template> 
    <xsl:template match="*[not(node())]" mode="encode"> 
     <xsl:value-of select="concat('&lt;',name())" 
         disable-output-escaping="yes"/> 
     <xsl:apply-templates select="@*" mode="encode"/> 
     <xsl:text>/></xsl:text> 
    </xsl:template> 
    <xsl:template match="@*" mode="encode"> 
     <xsl:value-of select="concat(' ',name(),'=&quot;',.,'&quot;')"/> 
    </xsl:template> 
</xsl:stylesheet> 

Với đầu vào này:

<root> 
    <img>http://example.org/image1.jpg</img> 
    <img>http://example.org/image2.jpg</img> 
    <img>http://example.org/image3.jpg</img> 
</root> 

Output:

<html> 
    <img src="http://example.org/image1.jpg"> 
    <img src="http://example.org/image2.jpg"> 
    <img src="http://example.org/image3.jpg"> 
    <!--<img src="http://example.org/image1.jpg"/> 
     <img src="http://example.org/image2.jpg"/> 
     <img src="http://example.org/image3.jpg"/>--> 
</html> 

Note: node-set chức năng mở rộng cho hai đường chuyền chuyển đổi. disable-output-escaping thuộc tính cho hướng dẫn xsl:value-of.

+0

@Alejandro: Tôi không thể sử dụng 'node-set' trong dự án của chúng tôi (tôi không có cách nào để kích hoạt tính năng này) – Kalinin

+0

@Kalinin: Việc sử dụng chức năng mở rộng' nút-set' là khoảng hai phép chuyển đổi, nó không phải về bạn cần: tắt tính năng thoát của đầu ra để ký tự '<' không phải là đầu ra như một tham chiếu thực thể '<'. Tất nhiên, nếu bạn không sử dụng phép chuyển đổi hai lần, bạn phải xây dựng mẫu contente cho "pseudoelements" giống như cách tôi đã làm trong các mẫu "mã hóa" chế độ đó. Ngoài ra, tôi chắc chắn rằng bộ xử lý của bạn có chức năng mở rộng 'node-set' nhưng dưới một không gian tên khác. Bạn sử dụng bộ xử lý XSLT nào? –

7
<xsl:comment><xsl:apply-templates select="image" /></xsl:comment> 

Kết quả là:

<!----> 

đó là mã trong các yếu tố xsl: bình luận bỏ qua

The XSLT 1.0 Spec nói:

Đó là lỗi nếu instantiating nội dung của xsl: comment tạo các nút ngoài các nút văn bản. Bộ xử lý XSLT có thể báo hiệu lỗi; nếu nó không báo hiệu lỗi, nó phải khôi phục bằng cách bỏ qua các vi phạm vi phạm cùng với nội dung của chúng.

Làm cách nào để hiển thị một mục trong các nhận xét ?

Nó phụ thuộc những gì là có nghĩa là để "trưng bày": trong một trình duyệt:

&lt;-- <xsl:apply-templates select="image" /> --> 

có thể hữu ích, cung cấp các kết quả của <xsl:apply-templates/> aboveis chỉ văn bản đơn giản (không đánh dấu).

Nếu để "trưng bày" có nghĩa là để cung cấp kết quả dưới dạng văn bản, sau đó DOE, nếu được phép bởi bộ xử lý XSLT, có thể cho chúng ta những kết quả mong muốn:

< - Một số văn bản - >

Cuối cùng, nếu nó được yêu cầu rằng những gì nên được bên trong "bình luận" nên được đánh dấu và nó sẽ được hiển thị như đánh dấu, sau đó điều này là khá khó khăn. Trong trường hợp này, người dùng phải sử dụng:

<xsl:output method="text"/> 

và nên trình bày mọi mục từ vựng XML với tuần tự mong muốn của nó (ví dụ: thoát).

Đây là cách Trình hiển thị XPath xây dựng đầu ra của nó.

Đây là một biến đổi nhỏ thể hiện hai phương pháp tiếp cận đầu tiên:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
     &lt;-- Hello, World --> 

    <xsl:text disable-output-escaping="yes">&lt;--</xsl:text> 
    Hello,world! --<xsl:text disable-output-escaping="yes">&gt;</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

chuyển đổi này, khi áp dụng trên bất kỳ tài liệu XML (không sử dụng), sản xuất:

 &lt;-- Hello, World --&gt; 

    <-- 
    Hello,world! --> 

Cả hai "bình luận" có thể được xem như là bình luận trong một trình duyệt, trong khi chỉ có "bình luận" được trình bày dưới dạng chú thích trong văn bản tự do.

Cách tiếp cận thứ ba (hầu hết có lẽ là những gì bạn muốn) được minh họa dưới đây:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    &lt;-- <xsl:apply-templates select="image"/> --> 

</xsl:template> 

<xsl:template match="image"> 
    &lt;img src="<xsl:value-of select="@src"/>" 
     width="<xsl:value-of select="@width"/>px" 
     height="<xsl:value-of select="@height"/>px"/> 
</xsl:template> 
</xsl:stylesheet> 

khi chuyển đổi này được áp dụng trên các tài liệu XML sau:

<image src="http://example.com/yyy.jpg" width="200" height="300"/> 

sự muốn kết quả được tạo ra:

&lt;-- 
    &lt;img src="http://example.com/yyy.jpg" 
     width="200px" 
     height="300px"/&gt; 
    --&gt; 

xem trong một trình duyệt như:

< - < img src = "http://example.com/yyy.jpg" width = "200px" height = "300px"/> - >

0

Như đã nói trước đây bởi Dimitri bạn không thể sử dụng hướng dẫn xsl: comment.

Nếu mục đích của bạn chỉ đơn giản là để bình luận một đoạn của cây, cách đơn giản nhất là đưa các ý kiến ​​đánh dấu dưới dạng văn bản (không thoát) như thế này:

<xsl:text disable-output-escaping="yes">&lt;!--</xsl:text><xsl:apply-templates select="image" /><xsl:text disable-output-escaping="yes">--&gt;</xsl:text> 

thay vì:

<xsl:comment><xsl:apply-templates select="image" /></xsl:comment> 

và bạn sẽ có được chính xác số này

<!-- <img src="path" width="100px" height="100px"/> --> 

sử dụng với msxml và saxon

+0

Tôi không thấy câu trả lời này khác với http://stackoverflow.com/a/3933175/272735 như thế nào – user272735

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