2010-05-07 17 views
6

Próbuję wygenerować kod C# za pomocą XSLT - jego pracy świetnie dopóki nie dostać się do leków generycznych i trzeba wyjściu jakiś tekst tak:XSLT: Wyłącz wyjście ucieczki w całym dokumencie

MyClass<Type> 

w tym przypadek odkryłem, że jedynym sposobem, aby emitować to wykonać następujące czynności:

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

Gdzie:

  • Często to wszystko musi iść w jednym l ine, inaczej możesz skończyć z podziałów wierszy w kodzie wygenerowanym
  • W powyższym przykładzie I technicznie mógł użyć tylko 1 <xsl:text /> jednak zwykle typ Type jest podana za pośrednictwem innego szablonu, na przykład:

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

Nie mam nic przeciwko temu, że muszę pisać &lt;, ale chciałbym uniknąć pisania <xsl:text disable-output-escaping="yes">&lt;</xsl:text> tylko dla jednej postaci!

Czy istnieje sposób na wykonanie disable-output-escaping="yes" dla całego dokumentu?

Odpowiedz

2

Powód, dla którego to nie działało, polegał na tym, że zastosowałem transformację - korzystałem z XslCompiledTransform i XmlWriter, aby przekształcić mój xml, jednak zgodnie z Microsoft XML Teams blog jak tylko użyję XmlWriter do napisania mojego wyjście tag jest ignorowany!

Naprawiłem to jawnie ustawiania ustawień wyjściowych XmlWriters do tych z XSL przekształcać:

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

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

Kiedyś zrobiłam tego, transformują przestrzegane mój tag, i wszystko było dobrze!

+0

Life saver! Dzięki! – killercowuk

0

Wiem, że to NIE jest bezpośrednia odpowiedź na twoje pytanie, ale.

Ogromne założenie tutaj: trzeba somthing jak:

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

Można zadzwonić szablon:

<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

jego pracy wielki aż dotrę do generycznych i trzeba wyjściu jakiś tekst podobnie jak:

MyClass<Type> 

W tym przypadku Znalazłem że Jedynym sposobem, aby emitować to zrobić następujący:

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

disable-output-ucieczce = "yes"> >

pewnością , to jest jedyny sposób i jest to najgorszy sposób na uzyskanie takiego wyniku..

Czy istnieje sposób robienia wyłącz-Output-cytowanie = „Tak” dla całego dokumentu?

To właśnie atrybutem <xsl:output>method="text" jest. Nie potrzebujesz DOE.

więc zastosować metodę wyjścia tex T i następnie:

MyClass&lt;Type> 

Powyżej znajduje się pełna mały przykład.

<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> 

Gdy powyższe transformacji jest stosowane na dowolnym dokumencie XML (nie używany), przy czym poszukiwanych wynik jest produkowany:

MyClass<Type> 

Jestem autorem XPath Visualizer, które produkuje IE- jak prezentacja plików XML - nigdzie w tym kodzie nie ma żadnego DOE.

+0

Mam już '' w moim XSLT, ale to nie ma znaczenia - czy możliwe jest nieprawidłowe wywołanie mojego procesora XSLT? – Justin

+0

@Kragen: Zaktualizowałem odpowiedź, aby podać pełny przykład generowania pożądanego tekstu bez DOE. –

+0

Dzięki - Nie mam pojęcia, dlaczego uważam, że to nie działa, ale teraz wydaje mi się to skuteczne. – Justin