需要获取同级节点的所有排列

Need to get all permutations of same-level nodes

我的源数据如下所示:

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

我需要获取两个数据 "id" 之间值的所有排列。所以我的输出看起来像这样:

<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。我显然可以在“123”或“234”数据节点上使用 "for-each",但我不知道如何退出然后获得另一个的排列。

看看这是否适合你:

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. 恕我直言,存储数据(原始父Dataid值 nodes) inside element names 不是好的做法。

  2. 未使用其他配置进行测试,因为您没有提供它们。

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