I. 在 XPath 2.0 中,只需将其转换为:
if(/*/propertyTypes/propertyType = 'RESIDENTIAL')
then
(if(/*/leasehold='Yes')
then 'Rent'
else 'Buy'
)
else
if(/*/leasehold='Yes')
then 'Leasehold'
else 'Freehold'
基于 XSLT 2.0 的验证:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:sequence select=
"if(/*/propertyTypes/propertyType = 'RESIDENTIAL')
then
(if(/*/leasehold='Yes')
then 'Rent'
else 'Buy'
)
else
if(/*/leasehold='Yes')
then 'Leasehold'
else 'Freehold'
"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档时:
<property id="1011">
<leasehold>No</leasehold>
<freehold>Yes</freehold>
<propertyTypes>
<propertyType>RESIDENTIAL</propertyType>
</propertyTypes>
</property>
对 XPath 表达式求值,并将该求值的结果复制到输出中:
Buy
二、XPath 1.0 解决方案
在 XPath 1.0 中没有if
运算符。
条件语句仍然可以使用单个 XPath 1.0 表达式来实现,但这更加棘手,并且表达式可能不太可读和易于理解。
这是一种通用方式(由 Jeni Tennison 首次提出)$stringA
在条件为时$cond
产生true()
,否则产生$stringB
:
concat(substring($stringA, 1 div $cond), substring($stringB, 1 div not($cond)))
这个公式的主要成就之一是它适用于任何长度的字符串,并且不需要指定长度。
说明:
在这里,我们根据定义使用以下事实:
number(true()) = 1
和
number(false()) = 0
然后
1 div 0 = Infinity
所以,如果$cond
是false
,上面的第一个参数concat()
是:
substring($stringA, Infinity)
这是空字符串,因为$stringA
长度有限。
另一方面,如果$cond
是,true()
那么上面的第一个参数concat()
是:
sibstring($stringA, 1)
那只是$stringA
。
因此,仅取决于$cond
上述两个参数之一的值concat()
是一个非空字符串(分别为$stringA
或$stringB
)。
将这个通用公式应用于具体问题,我们可以将大条件表达式的前半部分翻译成:
concat(
substring('rent',
1 div boolean(/*[leasehold='Yes'
and
propertyTypes/propertyType = 'RESIDENTIAL'
]
)
),
substring('buy',
1 div not(/*[leasehold='Yes'
and
propertyTypes/propertyType = 'RESIDENTIAL'
]
)
)
)
这应该让您了解如何将整个条件表达式转换为单个 XPath 1.0 表达式。
基于 XSLT 1.0 的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"concat(
substring('rent',
1 div boolean(/*[leasehold='Yes'
and
propertyTypes/propertyType = 'RESIDENTIAL'
]
)
),
substring('buy',
1 div not(/*[leasehold='Yes'
and
propertyTypes/propertyType = 'RESIDENTIAL'
]
)
)
)
"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档(上图)时,将评估 XPath 表达式并将此评估的结果复制到输出:
buy
请注意:
如果您决定用长度与原始字符串不同的其他字符串替换特定字符串,您只需在上面的 XPath 1.0 表达式中替换这些字符串,您不必担心指定任何长度。