我是XML / XSL的新手,并尝试将XML转换为另一种XML格式。 我有一个filemaker导出,我必须转换。 XML看起来像那样
<machineName>
<DATA>Machine 1</DATA>
<DATA>Machine 2</DATA>
<DATA>Machine 3</DATA>
<DATA>Machine 4</DATA>
<DATA>Machine 5</DATA>
<DATA>Machine 6</DATA>
<DATA>Machine 7</DATA>
</machineName>
<machineType>
<DATA>12</DATA>
<DATA>15</DATA>
<DATA>31</DATA>
<DATA>44</DATA>
<DATA>14</DATA>
<DATA>12</DATA>
<DATA>54</DATA>
</machineType>
<machineBuilt>
<DATA>1982</DATA>
<DATA>1985</DATA>
<DATA>1977</DATA>
<DATA>1966</DATA>
<DATA>1999</DATA>
<DATA>1975</DATA>
<DATA>2001</DATA>
</machineBuilt>
这就是它最终应该是什么样子:
<machine>
<name>Machine 1</name>
<machineType>12</machineType>
<machineBuilt>1982</machineBuilt>
</machine>
<machine>
<name>Machine 2</name>
<machineType>15</machineType>
<machineBuilt>1985</machineBuilt>
</machine>
<machine>
<name>Machine 3</name>
<machineType>31</machineType>
<machineBuilt>1977</machineBuilt>
</machine>
.... and so on
我设法阅读&#34; machineName / Data&#34;使用xsl:for-each命令将值转换为所需的格式。但我不知道如何阅读循环中的其他值。
有人能给我一些线索吗?
谢谢你的帮助 担答案 0 :(得分:1)
&#34;换位的标准方法&#34;这样的问题是选择一个第一级项目,然后迭代其二级子项并创建一个输出&#34; row&#34;对于每个那些,包含来自所有输入行中相应位置的数据。假设当前上下文是machineName
,machineType
和machineBuilt
的共同父元素:
<xsl:for-each select="machineName/DATA">
<xsl:variable name="pos" select="position()" />
<machine>
<name><xsl:value-of select="."/></name>
<type><xsl:value-of select="../../machineType/DATA[$pos]"/></type>
<built><xsl:value-of select="../../machineBuilt/DATA[$pos]"/></built>
</machine>
</xsl:for-each>
您可能会发现将三个并行的DATA元素集存储在单独的变量中稍微更具可读性:
<xsl:variable name="machineName" select="machineName/DATA" />
<xsl:variable name="machineType" select="machineType/DATA" />
<xsl:variable name="machineBuilt" select="machineBuilt/DATA" />
<xsl:for-each select="$machineName">
<xsl:variable name="pos" select="position()" />
<machine>
<name><xsl:value-of select="$machineName[$pos]"/></name>
<type><xsl:value-of select="$machineType[$pos]"/></type>
<built><xsl:value-of select="$machineBuilt[$pos]"/></built>
</machine>
</xsl:for-each>