我一直在使用XSLT将一些遗留的XML代码清理成更干净的格式。这是一个我没有找到适当解决方案的案例。起始XML如下所示:
<MyPoints>
<X_Values>
<X>11</X>
<X>12</X>
<X>13</X>
</X_Values>
<Y_Values>
<Y>21</Y>
<Y>22</Y>
<Y>23</Y>
</Y_Values>
</MyPoints>
这是我想要的:
<MyPoints>
<Values>
<Value X="11" Y="21" />
<Value X="12" Y="22" />
<Value X="13" Y="23" />
</Values>
</MyPoints>
X_Values和Y_Values保证具有相同数量的元素。我也想为3D点做这个,但这应该是解决方案的一个简单扩展。
如果可能的话,XSLT 1.0会很好。
答案 0 :(得分:1)
使用position()
应该可以解决问题。相关部分:
<xsl:for-each select="/MyPoints/X_Values/X">
<xsl:variable name="i"><xsl:value-of select="position()" /></xsl:variable>
<Value X="{.}" Y="{/MyPoints/Y_Values/Y[position()=$i]}" />
</xsl:for-each>
完整的样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
>
<xsl:output
method="xml"
version="1.0"
indent="yes"
doctype-public="-//W3C//DTD XHTML 1.1//EN"
doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
/>
<xsl:template match="/">
<MyPoints><Values>
<xsl:for-each select="/MyPoints/X_Values/X">
<xsl:variable name="i"><xsl:value-of select="position()" /></xsl:variable>
<Value X="{.}" Y="{/MyPoints/Y_Values/Y[position()=$i]}" />
</xsl:for-each>
</Values></MyPoints>
</xsl:template>
</xsl:stylesheet>