我需要将element的值发送给属性,该属性覆盖该属性名称。属性的值保持不变。
示例:
<engine hybrid="yes">
<A>2000</A>
<B>diesel</B>
<C>160</C>
</engine>
我需要实现的目标,例如:
<engine diesel="yes">
<A>2000</A>
<B>diesel</B>
<C>160</C>
</engine>
提前致谢!
答案 0 :(得分:0)
您应该将转换基于身份模板,它会将输入中的所有内容复制到输出中,除非此行为被更具体的模板覆盖,否则
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
有了这个,您就可以为engine
元素添加特定模板
<xsl:template match="engine">
<engine>
<!-- create an attribute whose name is taken from the first B child -->
<xsl:attribute name="{B}">yes</xsl:attribute>
<!-- and continue processing child nodes (but not other attributes) -->
<xsl:apply-templates />
</engine>
</xsl:template>
此处需要注意的关键是name
的{{1}}属性被视为“属性值模板” - 您可以将值的一部分括在大括号xsl:attribute
中部件将被评估为XPath表达式,而不是作为文字值。
最后,当然,您应该注意,这仅在{}
的内容是有效的XML属性名称时才有效(因此没有空格,没有B
或=
这样的字符,它不能以数字开头。