使用XSLT1.0处理复杂的条件检查
我有这样一个XML文件:使用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
<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不存在
get
值的格式,如果有其他格式可以更容易地执行我想要的操作
我假设需要发生的是,我将要检查的每个节点的get
值(本例中为7-10)发送到一个函数,该函数将“处理”公式并返回true或false
如果有必要,我可以修改get
值的格式(如果有)
其他一些格式可以让我更容易做我想做的事情
那么,如果您重新格式化get
值,以便:
和
或
节点[@ID=N]
,而不仅仅是其ID号<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的节点”?这太棒了。非常感谢!