Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSL从输入XML获取值_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

XSL从输入XML获取值

XSL从输入XML获取值,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我似乎在获取正确形式的xsl值方面遇到了困难。我有以下XML输入: <root> <output> <tagQ> <tag name="X"> <parameters> <parameter name="id">83683</parameter> </parameters>

我似乎在获取正确形式的xsl值方面遇到了困难。我有以下XML输入:

<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>

83683
83683
7260
10
2500

所需输出为:

<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>

83683
7260
10
2500*//来自输入的列的值//*
谢谢你的帮助。我已经用当前的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>


您的方法不起作用,因为

<xsl:value-of select="@*[@A]"/>
它选择名为
的子元素,其
名称
属性为
“a”

但是,我建议您尝试另一种方法——让XSLT的递归处理模型完成繁重的工作:

XSLT1.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>


1。你到底在哪里被困?2.“0000”的值从何而来?向我们展示您迄今为止尝试的内容,以及它产生的不正确输出。使用value tag name=“other”进行更正。使用当前XSL更新谢谢,您是对的!还有一个问题..如果我想更改属性名83683的输出,而我想改为name=“whatever”,你会如何处理模板匹配?相同的值,只是attirbute“name”的名称不同,恐怕您把我弄糊涂了:如果您想使用
name=“whatever”
,则会更改
name
属性的值。但你说“只是一个不同的名称为Atterbute”名称“;这将导致
whater=“A”
“如果您希望name=“whater”可以更改name属性的值,这是正确的。我指的name属性的值。如果我想要输出83683 7260 10 2500,那就更准确了。获取参数元素的相同值,但更改“name”属性的值。希望现在更清楚。您可能希望添加一个与
@name
属性匹配的模板,并在其中指定新值。不过,我不确定新价值来自何方。
<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>