使用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。我想做的是"处理"get"作为一个公式,根据节点是否存在和公式来获得真或假。 &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)到一个函数,该函数将"处理"公式并返回true或false。

如果有关系,我可以修改get值的格式一些其他的格式,使我更容易做我想做的。

嗯,如果你重新格式化get的值,使:

  1. 逻辑与写为and;
  2. 逻辑或写入or;
  3. 每个节点被称为node[@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>

则可以应用以下样式表:

XSLT 1.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>

相关内容

  • 没有找到相关文章

最新更新