XSLT 样式表如何执行 (a + b)(c + d) = ac + ad + bc + bd
XSLT stylesheet how to perform (a + b)(c + d) = ac + ad + bc + bd
我有一个带有布尔逻辑的 XML 结构,如下所示。我想生成所有不同的可能性并基本上开发表达式
(a + b)(c + d) = ac + ad + bc + bd
如果解决方案适用于更多级别,即。 (e + f) 或更多条件,即 (a + b + c) 更好。我尝试了几件事都没有成功。
<Indicator operator="AND">
<Indicator operator="OR">
<IndicatorItem>a</IndicatorItem>
<IndicatorItem>b</IndicatorItem>
</Indicator>
<Indicator operator="OR">
<IndicatorItem>c</IndicatorItem>
<IndicatorItem>d</IndicatorItem>
</Indicator>
<Indicator operator="OR">
<IndicatorItem>e</IndicatorItem>
<IndicatorItem>f</IndicatorItem>
</Indicator>
</Indicator>
如果我没猜错,你想枚举一个 OR 表达式的所有组合。鉴于您的示例,为清楚起见添加了值:
XML
<Indicator operator="AND">
<Indicator operator="OR">
<IndicatorItem>a</IndicatorItem>
<IndicatorItem>b</IndicatorItem>
</Indicator>
<Indicator operator="OR">
<IndicatorItem>c</IndicatorItem>
<IndicatorItem>d</IndicatorItem>
</Indicator>
<Indicator operator="OR">
<IndicatorItem>e</IndicatorItem>
<IndicatorItem>f</IndicatorItem>
</Indicator>
</Indicator>
以下样式表:
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:strip-space elements="*"/>
<xsl:template match="Indicator[@operator='AND']">
<combinations>
<xsl:apply-templates select="Indicator[@operator='OR'][1]"/>
</combinations>
</xsl:template>
<xsl:template match="Indicator[@operator='OR']">
<xsl:param name="prev"/>
<xsl:variable name="next" select="following-sibling::Indicator[@operator='OR']" />
<xsl:for-each select="IndicatorItem">
<xsl:variable name="this" select="concat($prev, .)" />
<xsl:choose>
<xsl:when test="$next">
<xsl:apply-templates select="$next[1]">
<xsl:with-param name="prev" select="concat($this, ' AND ')"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<combination>
<xsl:value-of select="$this"/>
</combination>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
将 return:
结果
<?xml version="1.0" encoding="UTF-8"?>
<combinations>
<combination>a AND c AND e</combination>
<combination>a AND c AND f</combination>
<combination>a AND d AND e</combination>
<combination>a AND d AND f</combination>
<combination>b AND c AND e</combination>
<combination>b AND c AND f</combination>
<combination>b AND d AND e</combination>
<combination>b AND d AND f</combination>
</combinations>
这适用于任意数量的 OR 运算符和任意数量的 OR'ed 项。但是,它不会考虑作为正在处理的 OR 运算符的兄弟姐妹的任何 AND 运算符。
我有一个带有布尔逻辑的 XML 结构,如下所示。我想生成所有不同的可能性并基本上开发表达式
(a + b)(c + d) = ac + ad + bc + bd
如果解决方案适用于更多级别,即。 (e + f) 或更多条件,即 (a + b + c) 更好。我尝试了几件事都没有成功。
<Indicator operator="AND">
<Indicator operator="OR">
<IndicatorItem>a</IndicatorItem>
<IndicatorItem>b</IndicatorItem>
</Indicator>
<Indicator operator="OR">
<IndicatorItem>c</IndicatorItem>
<IndicatorItem>d</IndicatorItem>
</Indicator>
<Indicator operator="OR">
<IndicatorItem>e</IndicatorItem>
<IndicatorItem>f</IndicatorItem>
</Indicator>
</Indicator>
如果我没猜错,你想枚举一个 OR 表达式的所有组合。鉴于您的示例,为清楚起见添加了值:
XML
<Indicator operator="AND">
<Indicator operator="OR">
<IndicatorItem>a</IndicatorItem>
<IndicatorItem>b</IndicatorItem>
</Indicator>
<Indicator operator="OR">
<IndicatorItem>c</IndicatorItem>
<IndicatorItem>d</IndicatorItem>
</Indicator>
<Indicator operator="OR">
<IndicatorItem>e</IndicatorItem>
<IndicatorItem>f</IndicatorItem>
</Indicator>
</Indicator>
以下样式表:
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:strip-space elements="*"/>
<xsl:template match="Indicator[@operator='AND']">
<combinations>
<xsl:apply-templates select="Indicator[@operator='OR'][1]"/>
</combinations>
</xsl:template>
<xsl:template match="Indicator[@operator='OR']">
<xsl:param name="prev"/>
<xsl:variable name="next" select="following-sibling::Indicator[@operator='OR']" />
<xsl:for-each select="IndicatorItem">
<xsl:variable name="this" select="concat($prev, .)" />
<xsl:choose>
<xsl:when test="$next">
<xsl:apply-templates select="$next[1]">
<xsl:with-param name="prev" select="concat($this, ' AND ')"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<combination>
<xsl:value-of select="$this"/>
</combination>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
将 return:
结果
<?xml version="1.0" encoding="UTF-8"?>
<combinations>
<combination>a AND c AND e</combination>
<combination>a AND c AND f</combination>
<combination>a AND d AND e</combination>
<combination>a AND d AND f</combination>
<combination>b AND c AND e</combination>
<combination>b AND c AND f</combination>
<combination>b AND d AND e</combination>
<combination>b AND d AND f</combination>
</combinations>
这适用于任意数量的 OR 运算符和任意数量的 OR'ed 项。但是,它不会考虑作为正在处理的 OR 运算符的兄弟姐妹的任何 AND 运算符。