Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT1.0处理复杂的条件检查_Xslt_Xslt 1.0 - Fatal编程技术网

使用XSLT1.0处理复杂的条件检查

使用XSLT1.0处理复杂的条件检查,xslt,xslt-1.0,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

我有这样一个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我想做的是将“get”作为一个公式进行“处理”,根据节点是否存在以及公式来获得true或false。
&
是逻辑的和,
是逻辑的或

例如:

  • 节点7 XSLT将返回true,因为节点1存在
  • 节点8 XLST将返回true,因为节点1和节点3都存在
  • 节点9将返回true,因为节点2和节点3存在(即使节点23不存在,因为
  • 节点10将返回false,因为节点15不存在
在纯XSLT1.0中是否有类似的操作

如果重要的话,我可以修改
get
值的格式,如果有其他格式可以更容易地执行我想要的操作

我假设需要发生的是,我将要检查的每个节点的
get
值(本例中为7-10)发送到一个函数,该函数将“处理”公式并返回true或false

如果有必要,我可以修改
get
值的格式(如果有) 其他一些格式可以让我更容易做我想做的事情

那么,如果您重新格式化
get
值,以便:

  • 逻辑AND写为
  • 逻辑OR写为
  • 每个节点被称为
    节点[@ID=N]
    ,而不仅仅是其ID号
  • 因此,您的输入XML实际上如下所示:

    XML

    <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>
    
    
    
    然后可以应用以下样式表:

    XSLT1.0

    <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>
    
    
    
    要获得此结果,请执行以下操作:

    <?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>
    
    
    
    此结果是有效的XSLT样式表。将其应用于输入XML将产生以下结果:

    <?xml version="1.0" encoding="UTF-8"?>
    <output>
       <result ID="7">true</result>
       <result ID="8">true</result>
       <result ID="9">true</result>
       <result ID="10">false</result>
    </output>
    
    
    真的
    真的
    真的
    假的
    
    在询问编程之前,您需要重新考虑您的需求:
    get
    属性的名称建议检索,而布尔连接器的使用则建议进行逻辑计算。到底是什么?您的示例建议检索,但拒绝了
    的逻辑性质,因为它们仅被视为要重新计算的项目的分隔符Trive;此外,您的示例忽略了逻辑
    ——您将如何“获得”
    2 | 4
    ?参数名
    get
    可以是任何东西。为了简单起见,我刚刚将其命名为
    get
    。其想法是XSLT当前正在查看节点7。它将使用
    get
    参数中的公式根据节点的ID值检索节点。我使用节点7的示例进行了更新,以提供更好的IDea.您仍然没有指定如何“获取”
    2 | 4
    不同于
    2&4
    。XSLT 1.0(或2.0)无法将字符串作为表达式计算,即使该字符串使用有效的XPath语法(与字符串不同)。某些处理器支持
    evaluate()
    作为一个扩展函数。如果没有它,您必须在两个过程中完成这项工作,其中第一个过程将生成XSLT样式表。您如何在XPath中表达“获取ID为2和4的节点”?这太棒了。非常感谢!