我的xml就像这样
<root>
<level1>
<value1>A</value1>
<value2>B</value2>
<value3>C</value3>
</level1>
<level1>
<value1>D</value1>
<value2>E</value2>
<value3>F</value3>
</level1>
</root>
我需要一个所需的输入作为&#34; A + D&#34;。我如何使用XSLT 2.0版实现这一目标?
答案 0 :(得分:1)
恕我直言,“正确”答案(即不将level1
组的数量硬编码为2或将组中的值数量硬编码为3的答案,如示例中所示): / p>
XSLT 2.0
<xsl:stylesheet version="2.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="/">
<root>
<xsl:for-each select="root/level1[1]/*">
<xsl:variable name="i" select="position()" />
<xsl:copy>
<xsl:value-of select="../../level1/*[$i]" separator=","/>
</xsl:copy>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
应用于以下测试输入:
<root>
<level1>
<value1>A</value1>
<value2>B</value2>
<value3>C</value3>
<value4>1</value4>
</level1>
<level1>
<value1>D</value1>
<value2>E</value2>
<value3>F</value3>
<value4>2</value4>
</level1>
<level1>
<value1>G</value1>
<value2>H</value2>
<value3>I</value3>
<value4>3</value4>
</level1>
</root>
结果:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<value1>A,D,G</value1>
<value2>B,E,H</value2>
<value3>C,F,I</value3>
<value4>1,2,3</value4>
</root>
请注意,值按位置匹配,而不是按名称匹配(如果需要,可以使用名称()上的密钥匹配来完成。
答案 1 :(得分:0)
此转化:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<root>
<value1>
<xsl:value-of select="concat(/root/level1[1]/value1,
',', /root/level1[2]/value1)"/>
</value1>
<value2>
<xsl:value-of select="concat(/root/level1[1]/value2,
',', /root/level1[2]/value2)"/>
</value2>
<value3>
<xsl:value-of select="concat(/root/level1[1]/value3,
',', /root/level1[2]/value3)"/>
</value3>
</root>
</xsl:template>
</xsl:stylesheet>
应用于此输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<level1>
<value1>A</value1>
<value2>B</value2>
<value3>C</value3>
</level1>
<level1>
<value1>D</value1>
<value2>E</value2>
<value3>F</value3>
</level1>
</root>
将生成请求的输出XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<value1>A,D</value1>
<value2>B,E</value2>
<value3>C,F</value3>
</root>
或者,如果您更喜欢更通用的解决方案:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/root">
<root>
<level1>
<xsl:for-each select="*[1]/*">
<xsl:variable name="valueNum" select="position()"/>
<xsl:copy>
<xsl:value-of select="/root/*/*[$valueNum]" separator=","/>
</xsl:copy>
</xsl:for-each>
</level1>
</root>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/*">
<root>
<xsl:for-each select="//level1[1]/*">
<xsl:variable name="position" select="position()"/>
<xsl:variable name="field" select="concat('value', $position)"/>
<xsl:element name="{$field}">
<xsl:value-of
select="concat(//level1[1]/*[$position],',', //level1[2]/*[$position])"/>
</xsl:element>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
产生输出
<?xml version="1.0" encoding="UTF-8"?>
<root>
<value1>A,D</value1>
<value2>B,E</value2>
<value3>C,F</value3>
</root>
对于第一级和第二级的所有子级1(如果示例中不仅仅是3)。顺便说一下,我建议为第二级别1使用不同的名称,例如level2,但也许这只是提供示例中的复制粘贴错误。