我正试图找到一种方法,将一个元素的多个属性组合成一个使用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;执行此操作因为只有一个属性被转换。
这些属性可以在虚拟元素上,需要使用现有的元素模板(即我不能在身份转换中执行此操作)。
有什么想法吗? 感谢。
答案 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>