为什么xsl模板规则不适用于使用XSLT指令插入的元素?

时间:2014-02-14 21:24:23

标签: plone diazo

我想插入例如主题的给定部分中的#content-core并在#content-core

下的元素中应用一些xsl指令

如果我们使用以下方案A规则,a下的#content-core元素将按预期替换:

情景A

<replace css:theme="#target_id" css:content="#content-core" />
<xsl:template match="a">REPLACED_LINK</xsl:template>

此方案A不是我需要的。我需要一个使用xsl指令插入元素的场景。

当我使用xsl指令插入元素时,如下所示,a下的#content-core元素将不会被替换。为什么呢?

情景B

<replace css:theme-children="#target_id">
    <xsl:copy-of css:select="#content-core"/>
</replace>
<xsl:template match="a">REPLACED_LINK</xsl:template>

如果<xsl:apply-templates />指令也按建议使用,则生成的主题将包含两个插入的#content-core元素:在第一个元素中,a元素将不会被替换,并且第二,他们将被取代。

情景C

<replace css:theme-children="#target_id">
    <xsl:copy-of css:select="#content-core"/>
    <xsl:apply-templates />  <!-- as suggested by SteveM, see answers -->
</replace>
<xsl:template match="a">REPLACED_LINK</xsl:template>

我正在使用的文件

我在这里复制了我正在使用的文件rules.xmlindex.html

<?xml version="1.0" encoding="UTF-8"?>
<rules
    xmlns="http://namespaces.plone.org/diazo"
    xmlns:css="http://namespaces.plone.org/diazo/css"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <theme href="index.html" />

    <!--replace css:theme="#target_id" css:content="#content-core" /-->
    <replace css:theme-children="#target_id">
        <xsl:copy-of css:select="#content-core"/>
        <xsl:apply-templates />  <!-- as suggested by SteveM, see answers -->
    </replace>

    <xsl:template match="a">REPLACED_LINK</xsl:template>
</rules>
<!DOCTYPE html>
<html>
<head></head>
<body><div id="target_id"/></body>
</html>

一些可能有用的提示

试图理解为什么这不起作用,因为我预期我一直在调试重氮rules.pycompiler.py,我发现compiled_doc返回的compiler.compile_theme(...)不同如下:

方案A的

compiled_doc

<xsl:apply-templates select="//*[@id = 'content-core']"/>
方案B的

compiled_doc

<xsl:copy-of css:select="#content-core" select="descendant-or-self::*[@id = 'content-core']"/>
<xsl:apply-templates/>

apply_rules(...) rules.py rules_doc之后,5c5,8 < <xsl:apply-templates xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dyn="http://exslt.org/dynamic" xmlns:esi="http://www.edge-delivery.org/esi/1.0" xmlns:exsl="http://exslt.org/common" xmlns:str="http://exslt.org/strings" select="//*[@id = 'content-core']"></xsl:apply-templates> --- > > <xsl:copy-of xmlns:xsl="http://www.w3.org/1999/XSL/Transform" css:select="#content-core" select="descendant-or-self::*[@id = 'content-core']"></xsl:copy-of> > <xsl:apply-templates xmlns:xsl="http://www.w3.org/1999/XSL/Transform"></xsl:apply-templates> > 8,9c11,14 < < <diazo:replace css:theme="#target_id" css:content="#content-core" xml:id="r2" theme="descendant-or-self::*[@id = 'target_id']" content="//*[@id = 'content-core']"><diazo:synthetic xmlns:dyn="http://exslt.org/dynamic" xmlns:esi="http://www.edge-delivery.org/esi/1.0" xmlns:exsl="http://exslt.org/common" xmlns:str="http://exslt.org/strings"><xsl:apply-templates xmlns:xsl="http://www.w3.org/1999/XSL/Transform" select="//*[@id = 'content-core']"></xsl:apply-templates></diazo:synthetic><diazo:matches><diazo:xmlid themeid="r1">idm16926224-index.html</diazo:xmlid></diazo:matches></diazo:replace> --- > <diazo:replace css:theme="#target_id" xml:id="r2" theme="descendant-or-self::*[@id = 'target_id']"><diazo:synthetic> > <xsl:copy-of xmlns:xsl="http://www.w3.org/1999/XSL/Transform" css:select="#content-core" select="descendant-or-self::*[@id = 'content-core']"></xsl:copy-of> > <xsl:apply-templates xmlns:xsl="http://www.w3.org/1999/XSL/Transform"></xsl:apply-templates> > </diazo:synthetic><diazo:matches><diazo:xmlid themeid="r1">idm16375952-index.html</diazo:xmlid></diazo:matches></diazo:replace> 之间的差异(方案A和B)如下:

{{1}}

0 个答案:

没有答案