簡體   English   中英

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>

將返回:

結果

<?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項。 但是,它將考慮與正在處理的OR運算符同級的任何AND運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM