XSLT - 连接元素属性

时间:2016-11-22 23:17:46

标签: xml xslt xslt-1.0

我正试图找到一种方法,将一个元素的多个属性组合成一个使用XSLT的单个分隔属性。

我正在尝试做的事情的简化示例,给定这样的XML元素:

<div border='none' padding='0' margin='0></div>

XSLT应该返回(注意空格)

<div style="border:0; padding:0; margin:0;"></div>

我似乎无法使用&lt; xsl:template match =“@ border”&gt;执行此操作因为只有一个属性被转换。

这些属性可以在虚拟元素上,需要使用现有的元素模板(即我不能在身份转换中执行此操作)。

有什么想法吗? 感谢。

1 个答案:

答案 0 :(得分:1)

  

这些属性可以在虚拟元素上,需要使用   现有元素模板

如果不了解这些模板的作用,很难提供建议。拥有这样的命名模板可能是最好的:

<xsl:template name="css">
    <xsl:attribute name="style">
        <xsl:for-each select="@*">
            <xsl:value-of select="name()"/>
            <xsl:text>:</xsl:text>
            <xsl:value-of select="."/>
            <xsl:text>; </xsl:text>
        </xsl:for-each>
    </xsl:attribute>
</xsl:template>

并从您需要的任何模板中调用它,例如:

<xsl:template match="div">
    <xsl:copy>
        <xsl:call-template name="css"/>
        <!-- YOUR EXISTING TEMPLATE CONTENT GOES HERE -->
    </xsl:copy>
</xsl:template>

加了:

或者,您可以使用与各个样式属性匹配的模板:

<xsl:template match="@border | @padding | @margin">
    <xsl:attribute name="style">
        <xsl:for-each select="../@*">
            <xsl:value-of select="name()"/>
            <xsl:text>:</xsl:text>
            <xsl:value-of select="."/>
            <xsl:text>; </xsl:text>
        </xsl:for-each>
    </xsl:attribute>
</xsl:template>

但您仍然需要将模板应用于(至少)父元素上下文中的一个属性:

<xsl:template match="div">
    <xsl:copy>
        <xsl:apply-templates select="@*[1]"/>
        <!-- YOUR EXISTING TEMPLATE CONTENT GOES HERE -->
    </xsl:copy>
</xsl:template>