создание файлов шаблонов django с помощью xslt - PullRequest
2 голосов
/ 13 января 2011

У меня есть около 4000 HTML-документов, которые я пытаюсь преобразовать в шаблоны Django, используя xslt. Проблема, с которой я столкнулся, заключается в том, что xslt экранирует фигурные скобки '{' для переменных шаблона, когда я пытаюсь включить переменную шаблона внутри тега атрибута; мой файл xslt выглядит так:

<xsl:template match="p">
    <p>
        <xsl:attribute name="nid"><xsl:value-of select="$node_id"/></xsl:attribute>
        <xsl:apply-templates select="*|node()"/>
    </p>
    <span>
        {% get_comment_count for thing '<xsl:value-of select="$node_id"/>' as node_count %}
        <a href="">{{ node_count }}</a> //This works as expected
    </span>
    <div>
        <xsl:attribute name="class">HControl</xsl:attribute>
        <xsl:text disable-output-escaping="yes">{% if node_count > 0 %}</xsl:text> // have to escape this because of the '>'
        <div class="comment-list">
            {% get_comment_list for thing '<xsl:value-of select="$node_id"/>' as node_comments %}
            {% for comment in node_comments %}
            <div class="comment {{ comment.object_id }}"> // this gets escaped
                <a>
                <xsl:attribute name="name">c{{ comment.id }}</xsl:attribute> //and so does this
                </a>
                <a>
                <xsl:attribute name="href">
                {% get_comment_permalink comment %}
                </xsl:attribute>
                permalink for comment #{{ forloop.counter }}
                </a>
                <div>
                {{ comment.comment }}
                </div>
            </div>
            {% endfor %}
        </div>
        {% endif %}
    </div>

вывод выглядит примерно так:

<div>
<p nid="50:1r:SB:1101S:5">
    <span class="Insert">B.  A person who violates this section is guilty of a class 1 misdemeanor.</span>
</p>
<span>
    <a href="">1</a>
</span>
<div class="HControl">
    <div class="comment-list">
        <div class="comment '{ comment.object_id }'"> // this should be class="comment #c123"
            <a name="c%7B%7B%20comment.id%20%7D%7D"></a> // this should name="c123"
            <a href="%7B%%20get_comment_permalink%20comment%20%%7D"> //this should be an href to the comment
                permalink for comment #1
            </a>
            <div>
                Well you should show some respect!
            </div>
        </div>
    </div>
</div>

Я преобразую файл с помощью lxml.etree, а затем передаю строку в объект шаблона django и отрисовываю его. Я просто не понимаю, как заставить парсер xslt оставить фигурные скобки в покое

1 Ответ

7 голосов
/ 13 января 2011

XSLT имеет свое предназначение для фигурных скобок - они используются в шаблонах значений атрибутов , например:

<!-- $someVariableOrExpression will be evaluated here -->
<div title="{$someVariableOrExpression}" />

Чтобы получить литерал фигурных скобок вЗначения атрибутов в XSLT, вам нужно избегать их, что делается путем удвоения их:

<!-- the title will be "{$someVariableOrExpression}" here -->
<div title="{{$someVariableOrExpression}}" />

Так что если вы хотите вывести буквальные двойные фигурные скобки, вам нужно (угадайте, что):

<div title="{{{{$someVariableOrExpression}}}}" />
...