2010-05-07 26 views
6

Tôi đang cố gắng để tạo ra một số mã C# sử dụng XSLT - làm việc của nó rất lớn cho đến khi tôi nhận được để Generics và cần phải ra một số văn bản như thế này:XSLT: Disable output escaping trong toàn bộ tài liệu

MyClass<Type> 

Trong này trường hợp tôi đã phát hiện ra rằng cách duy nhất để phát ra đây là phải làm như sau:

MyClass<xsl:text disable-output-escaping="yes">&lt;</xsl:text>Type<xsl:text disable-output-escaping="yes">&gt;</xsl:text> 

đâu:

  • thường thì nó tất cả cần phải đi trên một l ine, nếu bạn kết thúc với ngắt dòng trong mã được tạo
  • Trong ví dụ trên tôi về mặt kỹ thuật có thể sử dụng duy nhất 1 <xsl:text />, tuy nhiên thường là loại Type được đưa ra bởi một số mẫu khác, ví dụ như:

<xsl:value-of select="@type" />

Tôi không ngại phải viết &lt; nhiều, nhưng tôi muốn tránh viết <xsl:text disable-output-escaping="yes">&lt;</xsl:text> chỉ với một ký tự duy nhất!

Có cách nào để thực hiện disable-output-escaping="yes" cho toàn bộ tài liệu không?

Trả lời

2

Lý do tại sao điều này không hiệu quả là tôi đã áp dụng biến đổi - Tôi đã sử dụng XslCompiledTransform và XmlWriter để biến xml của tôi, tuy nhiên theo Microsoft XML Teams blog ngay sau khi tôi sử dụng XmlWriter để viết đầu ra thẻ bị bỏ qua!

tôi cố định này bằng cách thiết lập một cách rõ ràng các thiết lập XmlWriters đầu ra cho những người của XSL Transform:

XmlWriterSettings ws = xslt.OutputSettings.Clone(); 
ws.CheckCharacters = false; 

xslt.Transform("MyDocument.xml", XmlWriter.Create(Console.Out, ws)); 

Một khi tôi đã làm điều này, các biến đổi tôn trọng thẻ của tôi, và tất cả là tốt!

+0

Trình tiết kiệm cuộc sống! Cảm ơn! – killercowuk

0

Tôi biết đây KHÔNG phải là câu trả lời trực tiếp cho câu hỏi của bạn.

giả khổng lồ ở đây: bạn có somthing như:

<classthing class="MyClass" type="atype"/> 

Bạn có thể gọi một mẫu:

<xsl:template match="classthing"> 
    <xsl:call-template name="setgeneric"> 
     <xsl:with-param name="myclass"><xsl:value-of select="@class" /></xsl:with-param> 
     <xsl:with-param name="mytype"><xsl:value-of select="@type" /></xsl:with-param> 
    </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="setgeneric"> 
    <xsl:param name="myclass" /> 
    <xsl:param name="mytype" /> 
    <xsl:value-of select="$myclass"/> 
    <xsl:text disable-output-escaping="yes">&lt;</xsl:text> 
    <xsl:value-of select="$mytype"/> 
    <xsl:text disable-output-escaping="yes">&gt;</xsl:text> 
    </xsl:template> 
1

làm việc của nó rất lớn cho đến khi tôi nhận được để Generics và cần phải ra một số văn bản như sau:

MyClass<Type> 

Trong trường hợp này tôi đã tìm thấy rằng cách duy nhất để phát ra đây là để làm sau:

MyClass<xsl:text disable-output-escaping="yes">&lt;</xsl:text>Type<xsl:text 

disable-ra-thoát = "yes"> >

Chắc chắn , đây là không phải là cách duy nhất và đây là cách tồi tệ nhất để tạo ra kết quả như vậy.

Có cách nào để thực hiện tắt-xuất-thoát = "có" cho toàn bộ tài liệu không?

Đây là những gì method="text" thuộc tính của <xsl:output> là cho. Không cần DOE.

Vì vậy, sử dụng phương pháp đầu ra tex t và sau đó:

MyClass&lt;Type> 

Đây là một nhỏ hoàn dụ.

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    MyClass&lt;Type> 
</xsl:template> 
</xsl:stylesheet> 

Khi việc chuyển đổi trên được áp dụng trên bất kỳ tài liệu XML (không sử dụng), kết quả mong muốn được sản xuất:

MyClass<Type> 

Tôi là tác giả của XPath Visualizer, trong đó sản xuất tức là- giống như việc trình bày các tệp XML - không có nơi nào trong mã thie có bất kỳ DOE nào.

+0

Tôi đã có '' trong XSLT của mình, nhưng nó không có sự khác biệt - có thể tôi đang gọi bộ xử lý XSLT của mình không chính xác không? – Justin

+0

@Kragen: Tôi đã cập nhật câu trả lời để cung cấp cho bạn một ví dụ hoàn chỉnh về cách tạo văn bản mong muốn mà không cần DOE. –

+0

Cảm ơn - Tôi không biết tại sao tôi nghĩ nó không hoạt động, nhưng điều này dường như đã hiệu quả với tôi. – Justin

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