使用XSLT 1.0处理复杂的条件检查

时间:2016-10-04 13:10:04

标签: xslt xslt-1.0

我有一个像这样的XML文件:

<root>
    <node ID="1" />
    <node ID="2" />
    <node ID="3" />
    <node ID="4" />
    <node ID="5" />
    <node ID="6" />
    <node ID="7" get="1" />
    <node ID="8" get="1 & 3" />
    <node ID="9" get="(2 | 23) & 3" />
    <node ID="10" get="((2 | 3) & 1) & 15" />
</root>

忽略前6个节点一秒钟。我的XSLT正在处理节点7-10。 我想做的是&#34;流程&#34; &#34;得到&#34;作为根据节点是否存在以及公式得到真或假的公式。 &logical and|logical or

例如:

  • 节点7 XSLT将返回true,因为节点1存在
  • 节点8 XLST将返回true,因为节点1和节点3都存在
  • 节点9将返回true,因为节点2和节点3存在(即使节点23不是因为or
  • 节点10将返回false,因为节点15不存在

有没有用纯XSLT 1.0做这样的事情?

如果重要,我可以修改get值的格式,如果有其他格式可以让我更容易做到我想要的。

我认为需要发生的是我将要检查的每个节点get的值(在这种情况下为7-10)发送给将要处理&#34;处理&#34;的函数。公式并返回true或false。

1 个答案:

答案 0 :(得分:0)

  

如果重要,我可以修改$('.livesearch a').click(function(e) { e.preventDefault(); var value = $(this).html(); var TheTextBox = document.getElementById("addressbox"); TheTextBox.value = value; }); 值的格式(如果有)   其他一些格式可以让我更容易做到我想要的。

好吧,如果你重新格式化get值,那么:

  1. 逻辑AND写为get;
  2. 逻辑OR写为and;
  3. 每个节点都称为or,而不仅仅是其ID号
  4. 这样你的输入XML实际上就像这样:

    <强> XML

    node[@ID=N]

    然后您可以应用以下样式表:

    XSLT 1.0

    <root>
        <node ID="1" />
        <node ID="2" />
        <node ID="3" />
        <node ID="4" />
        <node ID="5" />
        <node ID="6" />
        <node ID="7" get="node[@ID=1]" />
        <node ID="8" get="node[@ID=1] and node[@ID=3]" />
        <node ID="9" get="(node[@ID=1] or node[@ID=23]) and node[@ID=3]" />
        <node ID="10" get="((node[@ID=2] or node[@ID=1]) and node[@ID=1]) and node[@ID=15]" />
    </root>
    

    收到此结果:

    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
    <xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>
    
    <xsl:template match="/root">
        <axsl:stylesheet version="1.0">
        <axsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
        <axsl:template match="/root">
            <output>
                <xsl:for-each select="node[@get]">
                    <result ID="{@ID}">
                        <axsl:value-of select="boolean({@get})"/>
                    </result>
                </xsl:for-each>
            </output>
        </axsl:template>
        </axsl:stylesheet>
    </xsl:template>
    
    </xsl:stylesheet>
    

    此结果是有效的XSLT样式表。将其应用于输入XML将产生以下结果:

    <?xml version="1.0" encoding="UTF-8"?>
    <axsl:stylesheet xmlns:axsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
       <axsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
       <axsl:template match="/root">
          <output>
             <result ID="7">
                <axsl:value-of select="boolean(node[@ID=1])"/>
             </result>
             <result ID="8">
                <axsl:value-of select="boolean(node[@ID=1] and node[@ID=3])"/>
             </result>
             <result ID="9">
                <axsl:value-of select="boolean((node[@ID=1] or node[@ID=23]) and node[@ID=3])"/>
             </result>
             <result ID="10">
                <axsl:value-of select="boolean(((node[@ID=2] or node[@ID=1]) and node[@ID=1])and node[@ID=15])"/>
             </result>
          </output>
       </axsl:template>
    </axsl:stylesheet>