【问题标题】:xml xsl recombine valuesxml xsl 重新组合值
【发布时间】:2015-02-13 20:11:46
【问题描述】:

我是 XML/XSL 的真正新手,并尝试将 XML 转换为另一种 XML 格式。 我有一个文件制作器导出,我必须转换它。 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

我设法读取了“machineName/Data”值并使用 xsl:for-each 命令将它们转换为所需的格式。但我不知道如何读取循环中的其他值。

谁能给我一个线索?

感谢您的帮助 丹

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    解决此类“转置”问题的标准方法是选择一个第一级项目,然后遍历其第二级子项并为每个子项创建一个输出“行”,其中包含来自所有对应位置的数据输入行。假设当前上下文是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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      相关资源
      最近更新 更多