4

I am using Diazo with Plone and have some xsl code that is working in the root of rules.xml but not inside an included .xml file. I would like to keep my rules.xml simple and keep the section specific styling inside each section's .xml file.

How can I add the class "subNav" to all li's using diazo from section-one.xml?

Not working (but desired):

rules.xml

<?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"
    xmlns:xi="http://www.w3.org/2001/XInclude">

    <rules if-path="section-one/">
        <xi:include href="section-one.xml" />
        <theme href="templates/section-one.html" />
    </rules>

    <rules if-not-path="section-two/">
        <xi:include href="section-two.xml" />
        <theme href="templates/section-two.html" />
    </rules>

</rules>

section-one.xml

<?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"
    xmlns:xi="http://www.w3.org/2001/XInclude">

    <replace css:content="#content" css:theme="#content"/>
    <xsl:template match="//li">
        <xsl:copy>
            <xsl:attribute name="class">subNav</xsl:attribute>
             <xsl:apply-templates />
         </xsl:copy>
     </xsl:template>
</rules>

Working (but not desired):

rules.xml

<?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"
    xmlns:xi="http://www.w3.org/2001/XInclude">

    <rules if-path="section-one/">
        <xi:include href="section-one.xml" />
        <theme href="templates/section-one.html" />
    </rules>

    <rules if-not-path="section-two/">
        <xi:include href="section-two.xml" />
        <theme href="templates/section-two.html" />
    </rules>
    <xsl:template match="//body[contains(@class, 'section-one')]//li">
        <xsl:copy>
            <xsl:attribute name="class">subNav</xsl:attribute>
             <xsl:apply-templates />
         </xsl:copy>
     </xsl:template>
</rules>

section-one.xml

<?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"
    xmlns:xi="http://www.w3.org/2001/XInclude">

    <replace css:content="#content" css:theme="#content"/>
</rules>
4

2 回答 2

8

这实际上与 XInclude 没有任何关系。相反,它是对 <rules if... /> 构造内的内联 XSL 处理的限制。

正如重氮文档所指出的:

内联 XSL 指令必须直接放在根 <rules> 标记内并无条件应用。

[顺便说一句,文档中的“无条件”并不完全正确。使用 method="raw" 将避免应用特定规则。]

内联 XSL 通常附加到转换后的主题之后生成的 XSL。Diazo 显然不知道如何处理 <rules if... /> 中的裸 XSL。所以,它省略了它。这可能是一件好事,因为其他任何事情都可能没有意义。

“内联”XSL 是指不在替换、之后、之前或附加到主题或内容元素的其他规则中的 XSL。具体来说,这是使用 xsl:template 的任何东西。

替换中的 XSL 不受此限制的约束。因此,您可以在 section-one.xml 中添加以下内容:

<replace css:content="li">
     <xsl:copy>
        <xsl:attribute name="class">subNav</xsl:attribute>
        <xsl:apply-templates />
     </xsl:copy>
</replace>

并得到我认为你所追求的。

于 2013-06-22T00:29:34.500 回答
0

使用适当的 XSL 属性配置每个规则标记,例如,更改section-one.xml为 [1]:

<rules
    xmlns="http://namespaces.plone.org/diazo"
    xmlns:css="http://namespaces.plone.org/diazo/css"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <replace css:content="#content" css:theme="#content"/>
    <xsl:template match="//li">
       <xsl:copy>
          <xsl:attribute name="class">subNav</xsl:attribute>
          <xsl:apply-templates />
       </xsl:copy>
    </xsl:template>
</rules>

[1] 不确定这是否可行。如果没有,您可能会考虑提交错误报告

于 2013-06-19T22:34:55.920 回答