XSL从输入XML获取值

时间:2016-07-12 16:43:49

标签: xml xslt xslt-1.0

我似乎无法获得正确形式的xsl-value。我有以下XML INPUT:

<root>
<output>
    <tagQ>
        <tag name="X">
            <parameters>
                <parameter name="id">83683</parameter>
            </parameters>
            <tagE/>
            <tagR>
                <R id="1">
                    <column name="A">83683</column>
                    <column name="B">7260</column>
                    <column name="C">10</column>
                    <column name="D">2500</column>
                </R>
            </tagR>
        </tag>
    </tagQ>
</output>

所需的输出是:

<newRoot>
<output>
    <tagQ>
        <tag name="another">
            <parameters>
                <parameter name="A">83683</parameter>
                <parameter name="B">7260</parameter>
                <parameter name="C">10</parameter>
                <parameter name="D">2500</parameter> *//value of columns from input//*
            </parameters>
        </tag>
    </tagQ>
</output>
</newRoot>

感谢您的帮助。我已经用当前的XSL更新了这个问题。输出很好,但我似乎无法弄清楚如何获得实际值

编辑: 目前的XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="*">
    <newRoot>
        <output>
            <tagQ>
                <tag name="another">
                    <parameters>
                        <parameter name="A">
                            <xsl:value-of select="@*[@A]"/>
                        </parameter>
                        <parameter name="B">
                            <xsl:value-of select="@*[@A]"/>
                        </parameter>
                        <parameter name="C">
                            <xsl:value-of select="@*[@A]"/>
                        </parameter>
                        <parameter name="D">
                            <xsl:value-of select="@*[@A]"/>
                        </parameter>
                    </parameters>
                </tag>
            </tagQ>
        </output>
    </newRoot>
</xsl:template>

1 个答案:

答案 0 :(得分:0)

您的方法不起作用,因为

<xsl:value-of select="@*[@A]"/>

没有选择任何内容。您位于root元素的上下文中 - 并且您的表达式尝试选择具有名为A的子属性的任何属性(当前节点的属性)。当然,不存在这样的动物。

您可以获得更多成功:

<xsl:value-of select=".//column[@name='A']"/>

选择column属性为name的名为"A"的后代元素。

但是,我建议你尝试一种不同的方法 - 让XSLT的递归处理模型能够解决这个问题:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="/root">
    <newRoot>
        <xsl:apply-templates/>
    </newRoot>
</xsl:template>

<xsl:template match="tag[@name='X']">
    <tag name="another">
        <parameters>
            <xsl:apply-templates select="tagR/R/column"/>
        </parameters>
    </tag>
</xsl:template>

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

</xsl:stylesheet>