Xml Xpath:Xpath表达式中的简单条件检查和赋值

Xml Xpath:Xpath表达式中的简单条件检查和赋值,xml,xpath,xml-parsing,Xml,Xpath,Xml Parsing,我需要做一个检查条件,如果条件不满足,需要硬编码值。下面是我的xml 我需要检查subroot内部的条件-如果ItemType=Table1和ItemCondition=Chair1,那么我必须给出一个硬编码值“继续”(这个硬编码值我将映射到目标端) 你能请任何人帮忙吗。提前谢谢 编辑: if (SubRoot[ItemType ='Table1' and ItemCondition ='Chair1']) then 'Proceed' else 'Decline' XPath用于选择节点

我需要做一个检查条件,如果条件不满足,需要硬编码值。下面是我的xml

我需要检查subroot内部的条件-如果ItemType=Table1和ItemCondition=Chair1,那么我必须给出一个硬编码值“继续”(这个硬编码值我将映射到目标端)

你能请任何人帮忙吗。提前谢谢

编辑:

 if (SubRoot[ItemType ='Table1'  and ItemCondition ='Chair1']) then 'Proceed' else 'Decline'

XPath用于选择节点或节点集。我认为您应该检查XQuery并生成新的XML文件

就像

   for $x in /Root/SubRoot
   return   if ($x/ItemType='Table1' and $x/ItemCondition='Chair1')
   then <SubRoot>'Proceed'</SubRoot>
   else $x
$x in/Root/SubRoot的

如果($x/ItemType='Table1'和$x/ItemCondition='Chair1',则返回
然后“继续”
其他$x

因为您没有指定是否要完全转换文档,所以我将假设您正在代码中的某个地方单独处理XML元素

对于XPath中的“if”条件,我经常使用一个技巧:

substring(<default_text>, 1 div <condition>)
这将只为符合指定条件的元素提供“继续”

但是,我注意到在您的编辑中,您还需要一个“else”值。一旦你理解了我刚才向你展示的方法,你就可以做一些聪明的工作,给你想要的东西:

concat(
    substring("Proceed", 1 div boolean(//Root/SubRoot[ItemType="Table1" and ItemCondition="Chair1"])),
    substring("Decline", 1 div not(//Root/SubRoot[ItemType="Table1" and ItemCondition="Chair1"]))
)

因此,如果元素满足这些条件,您基本上应该得到
concat(“继续”),这将导致“继续”,而
concat(“拒绝”)
将导致不满足这些条件的元素“拒绝”。

感谢您的快速回复。那么这在xpath!中是不可能的!。因为我有一个限制,只能使用xpath@derp:谢谢。如果条件失败,我必须发送一个硬编码值“继续”(我正在检查2个属性值ItemType和Item条件)。我正在使用一个构建在JAVA之上的工具。Xpath版本可能是最新版本。我也继续使用if-else条件(有问题的编辑),但没有希望。感谢您的支持。我试图实现第一个要测试的逻辑。但它会抛出类似于未为类型(xs:integer,xs:boolean)的参数定义算术运算符的错误。
。你能帮个忙吗。提前感谢您使用哪种语言/库/等来实现XPath?我使用的是Mule ESB,其中有datamapper来加载源和目标。在源代码方面,我们还可以选择使用xpath(我正在尝试)。版本3.5.1对不起,我不熟悉Mule ESB。但我可以向您保证,它是有效的XPath1.0语法。我用lxml测试了它。哈,我还找到了一个答案,有人在XPath中做了完全相同的事情:。可能布尔()与某个内部Mule函数冲突?您是否将整个XPath作为字符串传递?非常感谢。这有助于我解决问题。是的,这是一个有效的条件检查。
substring(<default_text>, 1 div <condition>)
substring("Proceed", 1 div boolean(//Root/SubRoot[ItemType="Table1" and ItemCondition="Chair1"]))
concat(
    substring("Proceed", 1 div boolean(//Root/SubRoot[ItemType="Table1" and ItemCondition="Chair1"])),
    substring("Decline", 1 div not(//Root/SubRoot[ItemType="Table1" and ItemCondition="Chair1"]))
)