【发布时间】:2016-06-02 04:32:39
【问题描述】:
鉴于此数据:
<?xml version='1.0' encoding='utf-8'?>
<data>
<pricePoint>
<optionGroup id='g1'>
<option id='a1'>a1</option>
<option id='a2'>a2</option>
</optionGroup>
<optionGroup id='g2'>
<option id='b1'>b1</option>
<option id='b2'>b2</option>
</optionGroup>
<optionGroup id='g3'>
<option id='c1'>c1</option>
<option id='c2'>c2</option>
</optionGroup>
</pricePoint>
</data>
我正在寻找的结果是:
<result>
<variant>
<option id='a1'>a1</option>
<option id='b1'>b1</option>
<option id='c1'>c1</option>
</variant>
<variant>
<option id='a1'>a1</option>
<option id='b1'>b1</option>
<option id='c2'>c2</option>
</variant>
<variant>
<option id='a1'>a1</option>
<option id='b2'>b2</option>
<option id='c1'>c1</option>
</variant>
<variant>
<option id='a1'>a1</option>
<option id='b2'>b2</option>
<option id='c2'>c2</option>
</variant>
<variant>
<option id='a2'>a2</option>
<option id='b1'>b1</option>
<option id='c1'>c1</option>
</variant>
<variant>
<option id='a2'>a2</option>
<option id='b1'>b1</option>
<option id='c2'>c2</option>
</variant>
<variant>
<option id='a2'>a2</option>
<option id='b2'>b2</option>
<option id='c1'>c1</option>
</variant>
<variant>
<option id='a2'>a2</option>
<option id='b2'>b2</option>
<option id='c2'>c2</option>
</variant>
</result>
也就是说,
- 带上第一个
<optionGroup>。 - 对于那里的每个
<option>,遍历所有其他<optionGroup>s 并将他们的<option>s 与“当前”一个“加入”——在结果文档中生成一个包含所有这些<option>s 的元素。
任何<pricePoint> 元素中<optionGroup> 元素的数量未知(一个或多个),任何<optionGroup> 元素中<option> 元素的数量也是未知的(一个或多个)。
据我了解,这是制作笛卡尔积的经典案例,但我不知道如何使用 XSLT 1.0 正确实现这一点。
到目前为止,我(相当无助)的尝试围绕着应用模板匹配 <optionGroup> 元素的想法,同时处理其中一个元素并尝试将其排除在进一步处理之外,如下所示:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="optionGroup">
<xsl:message>Saw optionGroup <xsl:value-of select="@id" /></xsl:message>
<xsl:variable name="id" select="@id" />
<xsl:apply-templates select="../optionGroup[@id != $id]" />
</xsl:template>
<xsl:template match="option">
<xsl:message>Saw option</xsl:message>
</xsl:template>
</xsl:stylesheet>
当然,到目前为止,我在应用模板时的所有尝试都因无限递归而失败。
【问题讨论】:
标签: xslt permutation self-join cartesian-product