Преобразование xml, содержащегося в текстовом (javascript) файле - PullRequest
1 голос
/ 18 февраля 2012

У меня есть файл JavaScript, который выглядит следующим образом:

if (x > 0 && x < 100) {
    $('#thing').append('<foo id="foo' + x + '">' + stuff + '</foo>');
}

И таблица стилей xsl, которая выглядит следующим образом:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="foo">
        <div>
            <xsl:copy-of select="@*"/>
            <xsl:value-of select="."/>
        </div>
     </xsl:template>
</xsl:stylesheet>

Я хочу иметь возможность применить этот шаблон ивозможно, другие xml, содержащиеся в файле javascript.

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

if (x > 0 && x < 100) {
    $('#thing').append('<div id="foo' + x + '">' + stuff + '</div>');
}

Я буду использовать следующие ограничения для файла javascript, если оноблегчает анализ:

  1. Я никогда не буду использовать &, <или> внутри или между тегами XML.
  2. Я никогда не буду использовать вложенные теги XML.
  3. Я буду использовать только двойные кавычки (") внутри или вокруг тегов XML для установки атрибутов элемента.
  4. У меня всегда будет один или несколько пробелов, окружающих каждый символ <или> в обычных частях javascripttext.

Возможно, при необходимости я смогу установить другие ограничения.

Я использую Saxon, поэтому я могу использовать функции XSLT 2.0 и расширения саксонии.

1 Ответ

1 голос
/ 11 марта 2012

Это похоже на работу (ваш вводимый текст в jsxml.txt):

$ saxon9 -it main jsxml.xsl
if (x > 0 && x < 100) {
    $('#thing').append('<div id="foo' + x + '">' + stuff + '</div>');
}


<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:dpc="data:,dpc">

<xsl:import href="http://web-xslt.googlecode.com/svn/trunk/htmlparse/htmlparse.xsl"/>

<xsl:output method="text"/>

<xsl:template name="main">
 <xsl:variable name="in" select="unparsed-text('jsxml.txt')"/>
  <xsl:copy-of select="dpc:serialise(dpc:apply-templates(dpc:htmlparse($in,'',false())))"/>
 </xsl:template>


<xsl:function name="dpc:apply-templates">
 <xsl:param name="n"/>
 <xsl:apply-templates select="$n"/>
</xsl:function>

<xsl:function name="dpc:serialise">
 <xsl:param name="n"/>
 <xsl:apply-templates select="$n" mode="verb"/>
</xsl:function>

<xsl:template mode="verb" match="*">
 <xsl:value-of select="concat('&lt;',name())"/>
 <xsl:value-of select="@*/concat(' ',name(),'=&quot;',.,'&quot;')"/>
 <xsl:value-of select="'&gt;'"/>
 <xsl:apply-templates mode="verb"/>
 <xsl:value-of select="concat('&lt;/',name(),'&gt;')"/>
</xsl:template>



<xsl:template match="foo">
 <div>
  <xsl:copy-of select="@*"/>
  <xsl:value-of select="."/>
 </div>
</xsl:template>

</xsl:stylesheet>
...