XSLT: отключить экранирование вывода во всем документе

Я пытаюсь сгенерировать код C# с помощью xslt-его отлично работает, пока я не доберусь до дженериков и не нужно вывести текст, как это:

MyClass<Type>

в данном случае я обнаружил, что единственный способ издавать это сделать следующее:

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

где:

  • часто все это должно идти по одной строке, иначе вы в конечном итоге с разрывами строк в сгенерированном коде
  • в приведенном выше примере я технически мог использовать только 1 <xsl:text />, однако, как правило, типа Type задается каким-то другим шаблоном, e.g:

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

Я не против писать &lt; много, но я хотел бы избежать написания <xsl:text disable-output-escaping="yes">&lt;</xsl:text> только для одного персонажа!

есть ли какой-либо способ сделать disable-output-escaping="yes" для всего документа?

3 ответов


причина, по которой это не работало, заключалась в том, что я применял преобразование - я использовал XslCompiledTransform и XmlWriter для преобразования моего xml, однако в соответствии с блог команд Microsoft XML как только я использую XmlWriter для записи моего вывода, тег игнорируется!

я исправил это, явно установив выходные параметры XmlWriters для параметров преобразования Xsl:

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

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

Как только я это сделал, преобразование, уважаемый мой тег, и все было хорошо!


его отлично работает, пока я не доберусь до generics и нужно вывести некоторый текст вот так:

MyClass<Type>

в этом случае я обнаружил, что единственный способ испустить это-сделать следующий:

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

disable-output-escaping= "yes">>

конечно, это не единственный способ, и это худший способ получить такой результат.

есть ли способ сделать disable-output-escaping= "yes" для весь документ?

это


Я знаю, что это не прямой ответ на ваш вопрос, но.

огромным допущением здесь: у вас есть что-то вроде:

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

вы можете вызвать шаблон:

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