我有一系列模板,它们以不同的方式处理各种类型的映射元素。但是,我希望将一组类似的属性添加到生成的元素中。有没有办法用XSLT函数执行此操作,还是有其他推荐的方法?
这是一个映射模板的示例,这个模板适用于没有源值的模板。这三个属性被添加到生成的元素中,我不想在每个映射模板中复制。有没有办法避免这样做?
<xsl:template match="mapping[source/not(*)]">
<xsl:element name="{{destination/attribute/text()}}" namespace="{{destination/attribute/@namespace}}">
<xsl:attribute name="mapping-key"><xsl:value-of select="generate-id(.)"/></xsl:attribute>
<xsl:attribute name="override"><xsl:value-of select="(@override, 'false')[1]"/></xsl:attribute>
<xsl:attribute name="single-value"><xsl:value-of select="(@single-value, 'false')[1]"/></xsl:attribute>
<!-- add custom stuff to the element specific to this template -->
</xsl:element>
</xsl:template>
谢谢,
-tj
答案 0 :(得分:2)
您确实可以在此使用xsl:attribute-set
,以允许您在不同的地方重复使用属性组。
例如,请参阅此XSLT(为简洁起见,我删除了namespace
创建)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:attribute-set name="attrSet">
<xsl:attribute name="mapping-key" select="generate-id(.)"/>
<xsl:attribute name="override" select="(@override, 'false')[1]"/>
<xsl:attribute name="single-value" select="(@single-value, 'false')[1]"/>
</xsl:attribute-set>
<xsl:template match="mapping[source/not(*)]">
<xsl:element name="{destination/attribute/text()}" use-attribute-sets="attrSet">
<!-- add custom stuff to the element specific to this template -->
</xsl:element>
</xsl:template>
</xsl:stylesheet>
注意,我使用稍微简化的格式来创建XSLT 2.0中可用的属性(在select
语句中使用xsl:attribute
)。
另外,我注意到,你在创建元素名称{{destination/attribute/text()}}"
时使用了双花括号,它应该只是单个,但我猜你在使用之前可能正在对XSLT进行一些文本预处理它,也许?