Насколько мне известно, и если я правильно понимаю ваш вопрос;в XSLT нет способа сделать это.Мое предположение состоит в том, что W3C рассматривает сохранение экранированного XML как антишаблон.Мой подход состоял в том, чтобы определить именованный шаблон:
<xsl:template name='recursive_escape'>
<xsl:text>;<</xsl:text>
<xsl:value-of select='local-name()'/>
<xsl:for-each select='child::attribute()'>
<xsl:value-of select='local-name()'/>
<xsl:text>='</xsl:text><xsl:value-of select='.'/><xsl:text>'</xsl:text>
</xsl:for-each>
<xsl:text>/;></xsl:text>....
И так далее.Я надеюсь, что вы можете расшифровать то, что я пытаюсь сделать здесь: создать вручную открывающий тег с именем узла контекста и именем и значением каждого атрибута, затем выполнить итерацию по каждому дочернему узлу узла контекста и вызвать тот же шаблонснова;и так далее.У меня нет исходной реализации, поэтому, без сомнения, в моем примере есть несколько ошибок;это просто руководство.
Если кто-нибудь знает, как лучше, я бы хотел это услышать;это может быть в XSLT 2.0, который еще не оформлен, IIRC.Для надежности и поддержки MSXML это должен быть XSLT 1.0.