需要获取同级节点的所有排列
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>
注意:
恕我直言,存储数据(原始父Data
的id
值
nodes) inside element names 不是好的做法。
未使用其他配置进行测试,因为您没有提供它们。
如果我没记错的话,这些是组合,而不是排列。
我的源数据如下所示:
<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>
注意:
恕我直言,存储数据(原始父
Data
的id
值 nodes) inside element names 不是好的做法。未使用其他配置进行测试,因为您没有提供它们。
如果我没记错的话,这些是组合,而不是排列。