我似乎无法获得正确形式的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>
答案 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>