需要获得相同级别节点的所有排列

时间:2015-01-23 14:02:58

标签: xml xslt xslt-1.0

我的源数据如下所示:

<Nodes>
  <Node id="abc">
    <Data id="123">
      <Value>Red</Value>
      <Value>Green</Value>
    </Data>
    <Data id="234">
      <Value>North</Value>
      <Value>South</Value>
    </Data>
  </Node>
  <Node id="xyz">
    <Data id="123">
      <Value>Red</Value>
    </Data>
    <Data id="234">
      <Value>North</Value>
      <Value>South</Value>
    </Data>
  </Node>
</Nodes>

我需要在两个数据之间获得所有值的排列&#34; id&#34; s。所以我的输出看起来像这样:

<Nodes>
  <Node>
    <Value>abc</Value>
    <Value123>Red</Value123>
    <Value234>North</Value234>
  </Node>
  <Node>
    <Value>abc</Value>
    <Value123>Red</Value123>
    <Value234>South</Value234>
  </Node>
  <Node>
    <Value>abc</Value>
    <Value123>Green</Value123>
    <Value234>North</Value234>
  </Node>
  <Node>
    <Value>abc</Value>
    <Value123>Green</Value123>
    <Value234>South</Value234>
  </Node>      
  <Node>
    <Value>xyz</Value>
    <Value123>Red</Value123>
    <Value234>North</Value234>
  </Node>
  <Node>
    <Value>xyz</Value>
    <Value123>Red</Value123>
    <Value234>South</Value234>
  </Node>
</Nodes>

我只能使用XSL 1.0。我显然可以使用&#34; for-each&#34;在&#34; 123&#34;或者&#34; 234&#34;数据节点,但我无法弄清楚如何退出然后获得另一个的排列。

1 个答案:

答案 0 :(得分:1)

看看这是否适合您:

XSLT 1.0

<xsl:stylesheet version="1.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="/Nodes">
    <nodes>
        <xsl:apply-templates select="Node"/>
    </nodes>
</xsl:template>

<xsl:template match="Node">
    <xsl:variable name="node-id" select="@id" />
    <xsl:for-each select="Data/Value">
        <xsl:variable name="current-value" select="." />
        <xsl:variable name="current-id" select="../@id" />
            <xsl:for-each select="../following-sibling::Data/Value">
                <node>
                    <value><xsl:value-of select="$node-id"/></value>
                    <value id="{$current-id}"><xsl:value-of select="$current-value"/></value>
                    <value id="{../@id}"><xsl:value-of select="."/></value>
                </node>
            </xsl:for-each>
        </xsl:for-each>
</xsl:template> 

</xsl:stylesheet>

应用于您的输入示例,结果为:

<?xml version="1.0" encoding="UTF-8"?>
<nodes>
   <node>
      <value>abc</value>
      <value id="123">Red</value>
      <value id="234">North</value>
   </node>
   <node>
      <value>abc</value>
      <value id="123">Red</value>
      <value id="234">South</value>
   </node>
   <node>
      <value>abc</value>
      <value id="123">Green</value>
      <value id="234">North</value>
   </node>
   <node>
      <value>abc</value>
      <value id="123">Green</value>
      <value id="234">South</value>
   </node>
   <node>
      <value>xyz</value>
      <value id="123">Red</value>
      <value id="234">North</value>
   </node>
   <node>
      <value>xyz</value>
      <value id="123">Red</value>
      <value id="234">South</value>
   </node>
</nodes>

注意

  1. 恕我直言,存储数据(原始父id的{​​{1}}值 元素名称中的节点不是好习惯。

  2. 未经测试,因为您没有提供其他配置。

  3. 如果我没弄错的话,这些是组合,而不是排列