有没有办法在覆盖attr set时从XSLT属性集中删除所有属性?

时间:2013-04-17 18:43:59

标签: xslt xslt-2.0 xslt-3.0

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

notes.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),或者给定的文档将会如此不同以至于更容易重新开始而不是合并我的属性设置为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中有新功能可以实现这一点,我很乐意了解它。

谢谢!

1 个答案:

答案 0 :(得分:5)

属性集的使用并不是很广泛,为了回答你的问题,我必须查看规范以刷新我的记忆。我认为没有办法实现你想要的东西;你不能真正覆盖导入样式表中的属性集,你只能补充它。在设计良好的XML词汇表中,通常可以设置一个属性值,相当于省略属性,但如果不是这样,那么就会被卡住。