将日期定义为:
<xsl:variable name="date" select="//date"/>
,
我会避免使用后代轴并使用更明确的路径:
<xsl:variable name="date" select="/Header/info/data/Body/*/date"/>
这是假设输入不能同时包含 basketAB
和 basketCDE
元素(这一点从您的问题中不清楚,但否则这和当前接受的答案都不起作用)。
如果上述假设不正确,您可以这样做:
<xsl:variable name="date" select="/Header/info/data/Body/*[contains(name(),$typology)]/date"/>
,
使用这个单一的 XPath 1.0 表达式:
concat(/Header/info/data/Body/basketAB
[contains('|A|B|',concat('|',$typology,'|'))]/date
| /Header/info/data/Body/basketCDE
[contains('|C|D|E|','|'))]/date,substring('CheckPath',1 div not(contains('|A|B|C|D|E|','|'))))
)
使用 XSLT 1.0 进行验证:
给定这个源 XML 文档:
<Header>
<info>
<data>
<Body>
<basketAB>
<date>date1</date>
</basketAB>
<basketCDE>
<date>date2</date>
</basketCDE>
</Body>
</data>
</info>
</Header>
这个 XSLT 转换计算上面的 XPath 表达式并输出这个计算的结果:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="typology" select="'A'"/>
<xsl:template match="/">
<xsl:variable name="date" select=
"concat(/Header/info/data/Body/basketAB[contains('|A|B|','|'))]/date
| /Header/info/data/Body/basketCDE[contains('|C|D|E|','|'))))
)"/>
<xsl:value-of select="$date"/>
</xsl:template>
</xsl:stylesheet>
多次运行转换,每次为变量 $typology
指定不同的值:
在所有情况下都会产生想要的结果:
'A' --> 日期 1
'B' --> 日期 1
'C' --> 日期 2
'D' --> 日期 2
'E' --> 日期 2
'X' --> 检查路径
本文链接:https://www.f2er.com/4959.html