XSLT - 删除值并添加属性

时间:2018-03-12 09:31:21

标签: xml xslt

当节点具有属性class="deleted"时,我想将节点的值添加到名为text的属性中。

此输入:

<element class="deleted" >
    <span>Example</span>
</element>

应创建此输出:

<element class="deleted" text="&ltspan>Example&lt/span>" /> **Edit**

我使用的.xsl是:

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

<xsl:template match="node()[@class = 'deleted']">
    <xsl:copy>
        <xsl:attribute name="text">
            <xsl:value-of select="child::node()" />
        </xsl:attribute>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
</xsl:template>

并且输出不像它想要的那样:

<element text="Example" class="deleted"><span>Example</span></element>

问题是我不知道如何移除值并将span标记带入属性text

1 个答案:

答案 0 :(得分:1)

删除值:

请不要在复制之后应用模板,而只应在属性上应用模板。

<xsl:template match="node()[@class = 'deleted']">
    <xsl:copy>
        <xsl:apply-templates select="@*" />
        <xsl:attribute name="text">
            <xsl:value-of select="child::node()" />
        </xsl:attribute>
    </xsl:copy>
</xsl:template>

要将值及其标记放在属性中,您几乎需要将其序列化为文本。您可以定义一个负责该模板的模板:

<xsl:template mode="serialize-to-text" match="text()">
    <xsl:copy/>
</xsl:template>

<xsl:template mode="serialize-to-text" match="*">
    <xsl:value-of select="concat('&lt;', name(), '>')"/>
    <xsl:apply-templates mode="serialize-to-text" select="node()" />
    <xsl:value-of select="concat('&lt;/', name(), '>')"/>
</xsl:template>

并称之为:

<xsl:template match="node()[@class = 'deleted']">
    <xsl:copy>
        <xsl:attribute name="text">
            <xsl:apply-templates mode="serialize-to-text" select="node()" />
        </xsl:attribute>
    </xsl:copy>
</xsl:template>