我有一个这样的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
的值,使:
- 逻辑与写为
and
; - 逻辑或写入
or
; - 每个节点被称为
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>