根据属性值XSLT更改元素名称

时间:2015-10-01 15:41:09

标签: xml xslt

我想使用XSLT做一些简单的事情(或者我认为)。 我想将元素列表拆分为两个,使用重命名元素 想法是xml形成如下:

<elem at="value" id="something"/>
<elem at="value" id="something2"/>
<elem at="random" id="something3"/>

将转换为:

<elemVal id="something"/>
<elemVal id="something2"/>
<elemRa id="something3"/>

(新元素名称是静态的) 因此,元素将根据属性的值重命名。

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
</xsl:template>

<xsl:template match="elem/@at[.='value']">
    <xsl:element name="elemVa">
        <xsl:apply-templates select="node()|@*"/>
    </xsl:element>
</xsl:template>

到目前为止,我有一个身份模板,但我不明白我如何倒退并更改元素名称,保留其内容。

1 个答案:

答案 0 :(得分:4)

而不是

<xsl:template match="elem/@at[.='value']">

你需要

<xsl:template match="elem[@at ='value']">

然后创建新元素(文字就足够了)并确保未处理at属性:

<xsl:template match="elem[@at ='value']">
    <elemVa>
        <xsl:apply-templates select="@* except @at | node()"/>
    </elemVa>
</xsl:template>

以上是XSLT / XPath 2.0,在1.0中你可以使用

<xsl:template match="elem[@at ='value']">
    <elemVa>
        <xsl:apply-templates select="@*[not(local-name() = 'at')] | node()"/>
    </elemVa>
</xsl:template>