2

我正在使用一些第三方 XSLT,它们大量使用属性集将 XML 转换为各种形式的 XSL:FO。例子:

笔记.xsl:

<xsl:template match="note">
    <fo:block xsl:use-attribute-sets="noteAttrs">
        <!-- This is a pretty big template with lots of xsl:choose/xsl:if/etc. -->
     </fo:block>
<xsl:template>

<xsl:attribute-set name="noteAttrs">
    <xsl:attribute name="margin-left">10px</xsl:attribute>
    <xsl:attribute name="margin-right">8px</xsl:attribute>
    <xsl:attribute name="margin-top">5px</xsl:attribute>
    <xsl:attribute name="font-size">10pt</xsl:attribute>
    <!-- several other attributes -->
</xsl:attribute>

我的想法是导入这个 XSLT,重新定义我认为合适的属性集。如果我只需要给定 .fo 文档的不同字体大小...

<xsl:import href="notes.xsl"/>
<xsl:attribute-set name="noteAttrs">
    <xsl:attribute name="font-size">12pt</xsl:attribute>
</xsl:attribute>

问题是有时我需要完全删除属性(即我从包​​含的 fo:block 继承),或者给定的 fo 文档将如此不同,以至于重新开始而不是合并我的属性集会更容易来自notes.xsl的那个。XSLT 2.0 中有没有一种方法可以做到这一点,而无需复制整个笔记模板并在 fo:block 上指定不同的属性集?我想我希望能够做这样的事情:

<xsl:import href="notes.xsl"/>
<xsl:attribute-set name="noteAttrs" merge_with_imported_attr_set="false">
    <xsl:attribute name="font-size">12pt</xsl:attribute>
</xsl:attribute>

我不能立即切换到 XSLT 3.0 处理器,但是如果 3.0 中有新的东西可以实现这一点,我很想知道它。

谢谢!

4

1 回答 1

5

属性集的使用不是很广泛,要回答您的问题,我必须查看规范以刷新记忆。我认为没有任何方法可以实现您想要的。您不能真正覆盖导入样式表中的属性集,您只能对其进行补充。在精心设计的 XML 词汇表中,通常可以设置一个属性值,该值等同于省略该属性,但如果不是这种情况,那么您将陷入困境。

于 2013-04-17T21:56:52.903 回答