xml xsl重组值

时间:2015-02-13 11:58:59

标签: xml xslt

我是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命令将值转换为所需的格式。但我不知道如何阅读循环中的其他值。

有人能给我一些线索吗?

谢谢你的帮助 担

1 个答案:

答案 0 :(得分:1)

&#34;换位的标准方法&#34;这样的问题是选择一个第一级项目,然后迭代其二级子项并创建一个输出&#34; row&#34;对于每个那些,包含来自所有输入行中相应位置的数据。假设当前上下文是machineNamemachineTypemachineBuilt的共同父元素:

<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>