XSL从输入XML获取值
我似乎在获取正确形式的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>
<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>