我可以使用XSLT函数来复制在类似模板中添加xsl:attribute语句

时间:2017-09-16 23:17:54

标签: xslt xslt-2.0

我有一系列模板,它们以不同的方式处理各种类型的映射元素。但是,我希望将一组类似的属性添加到生成的元素中。有没有办法用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

1 个答案:

答案 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进行一些文本预处理它,也许?