gpt4 book ai didi

xpath - xpath 中的嵌套条件 if else 语句

转载 作者:行者123 更新时间:2023-12-03 15:23:56 26 4
gpt4 key购买 nike

我有这个 XML:

<property id="1011">
<leasehold>No</leasehold>
<freehold>Yes</freehold>
<propertyTypes>
<propertyType>RESIDENTIAL</propertyType>
</propertyTypes>
</property>

我想创建一个与以下嵌套 if-else 伪代码块相同的 xpath 语句。
if( propertyTypes/propertyType == 'RESIDENTIAL') {
if( leasehold == 'Yes' ){
return 'Rent'
} else
return 'Buy'
}
} else {
if( leasehold == 'Yes' ){
return 'Leasehold'
} else
return 'Freehold'
}
}

我已经看到了有关贝克尔方法的一些信息,但我无法真正遵循它。 XPath 真的不是我的强项。

最佳答案

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运算符(operator)。

条件语句仍然可以使用单个 XPath 1.0 表达式来实现,但这更加棘手,并且表达式可能不太可读和易于理解。

这是生成 $stringA 的通用方法(由 Jeni Tennison 首次提出)当一个条件 $condtrue()否则产生 $stringB :
concat(substring($stringA, 1 div $cond), substring($stringB, 1 div not($cond)))

该公式的主要成就之一是它适用于任何长度的字符串,并且不需要指定长度 .

解释 :

在这里,我们根据定义使用以下事实:
number(true()) = 1


number(false()) = 0

然后
1 div 0 = Infinity

所以,如果 $condfalseconcat() 的第一个参数以上是:
 substring($stringA, Infinity)

这是空字符串,因为 $stringA有一个有限的长度。

另一方面,如果 $condtrue()那么 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 表达式中替换这些字符串,您不必担心指定任何长度。

关于xpath - xpath 中的嵌套条件 if else 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12977309/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com