【问题标题】:building django template files with xslt使用 xslt 构建 django 模板文件
【发布时间】:2011-06-08 03:15:15
【问题描述】:

我有大约 4,000 个 html 文档,我正在尝试使用 xslt 将它们转换为 django 模板。我遇到的问题是,当我尝试在属性标记中包含模板变量时,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 解析器不理会花括号

【问题讨论】:

  • 顺便说一句,您应该删除所有 disable-output-escaping 属性,它们在您使用它们的地方是错误的。
  • 第一个是必需的,因为 &gt; 被转义并导致 django 在解析模板时崩溃,还是有其他方法?我会删除其他的,谢谢!
  • 是的,你是对的。第一个确实是正确的,没有其他办法。

标签: xslt django-templates escaping lxml


【解决方案1】:

XSLT 对花括号有自己的用途 - 它们在 Attribute Value Templates 中使用,如下所示:

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

要将 literal 花括号转换为 XSLT 中的属性值,您需要对它们进行转义,这是通过将它们加倍来完成的:

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

所以如果你想输出文字 double 花括号,你需要(猜猜看):

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

【讨论】:

  • 将花括号加倍在&lt;div class="comment {{{{comment.object_pk}}}}"&gt; 中有效,但在下面的两个锚标记中,我仍然得到转义的花括号,即&lt;a name="{{{{comment.id}}}}" 只是给我&lt;a name="%7B%7B%%7B%7B%comment.id%7D%7D%7D%7D"&gt; 我是否尝试使用xsl 属性标记或只是内联。我显然不太擅长 xslt :)
  • @Anvil:这很奇怪。看起来 a.namea.href 属性的内容由于某种原因自动进行了 URL 编码。 Vanilla XSLT 不了解 URL 编码,因此根本不应该发生这种情况。
  • 所以问题可能出在 lxml 上?
  • @Anvil:可能,是的。首先,尝试将&lt;xsl:output method="xml" /&gt; 添加到您的样式表中。如果这没有帮助:您可以使用不同的 XSLT 引擎吗?要么,要么检查是否有您不知道的配置选项(对于另一个问题来说这是很好的材料,添加一个仅重现错误的三行代码示例)。
  • 这是我提出的问题的正确答案。并且似乎编码是一个功能而不是一个错误;)我会问另一个问题,谢谢
猜你喜欢
  • 2022-07-13
  • 2011-02-24
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 2016-01-20
  • 1970-01-01
相关资源
最近更新 更多