用于将XML节点名转换为节点值的XSLT

时间:2014-05-27 10:40:24

标签: xml xslt

我是XSLT的新手,我正在努力完成下面的工作。我试图通过添加节点名称作为附加节点来减少XML文档中的层次结构。我虽然无法编写正确的XSLT。还有,有没有其他方法来实现这一点(没有XSLT,任何工具?)?

感谢您的任何帮助。感谢。

输入XML:

    <Rates>
    <Rate1>
        <Current>
            <onsite>100</onsite>
            <net>100</net>
            <gross>100</gross>
        </Current>
        <Past>
            <onsite>100</onsite>
            <net>100</net>
            <gross>100</gross>
        </Past>
    </Rate1>
    <Rate2>
        <Current>
            <onsite>2100</onsite>
            <net>2100</net>
            <gross>2100</gross>
        </Current>
        <Past>
            <onsite>2100</onsite>
            <net>2200</net>
            <gross>1200</gross>
        </Past>
    </Rate2>
</Rates>

预期输出:

<Rates>
    <Rate>
        <RateType>Rate1</RateType>
        <RateHistory>Current</RateHistory>
        <onsite>100</onsite>
        <net>100</net>
        <gross>100</gross>
    </Rate>
    <Rate>
        <RateType>Rate1</RateType>
        <RateHistory>Past</RateHistory>
        <onsite>100</onsite>
        <net>100</net>
        <gross>100</gross>
    </Rate>
    <Rate>
        <RateType>Rate2</RateType>
        <RateHistory>Current</RateHistory>
        <onsite>2100</onsite>
        <net>2100</net>
        <gross>2100</gross>
    </Rate>
    <Rate>
        <RateType>Rate2</RateType>
        <RateHistory>Past</RateHistory>
        <onsite>2100</onsite>
        <net>2200</net>
        <gross>1200</gross>
    </Rate>
</Rates>

2 个答案:

答案 0 :(得分:2)

您正在寻找此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:strip-space elements="*"/>

    <xsl:output indent="yes"/>

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

    <xsl:template match="Current|Past">
        <Rate>
            <RateType><xsl:value-of select="name(..)"/></RateType>
            <RateHistory><xsl:value-of select="name()"/></RateHistory>
            <xsl:apply-templates/>
        </Rate>
    </xsl:template>

    <xsl:template match="Rate1|Rate2">
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:2)

假设提前知道费率类型(并且,假设CurrentPast是唯一可能{{1}值})尝试:

RateHistory