XSLT 1.0将属性值复制为文本并删除该属性

时间:2017-05-04 06:46:30

标签: xslt

我想复制attiribute值并将其作为元素文本移动并删除该元素的属性。注意:它必须匹配元素名称,因为我不想删除其他元素的属性。

输入:

<a name = "attr" value = "text"/>

预期

<a name = "attr"> text </a>

1 个答案:

答案 0 :(得分:0)

假设这是一个示例XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <a name="attr" value="text" />
</root>

然后这个样式表将产生所需的输出:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml"/>

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

    <xsl:template match="a">
        <xsl:copy>
            <xsl:apply-templates select="@*[local-name() != 'value']"/>
            <xsl:value-of select="@value" />
        </xsl:copy>
    </xsl:template>

</xsl:transform>

输出:

<?xml version="1.0" encoding="UTF-8"?><root>
    <a name="attr">text</a>
</root>

默认模板只是递归复制。第二个模板匹配<a>元素。它首先为非value的属性应用模板,然后复制属性value的文本。它必须这样做,因为如果属性值出现在其他属性之前,则开始标记已经结束以开始其文本内容,然后其他属性不再被复制。