我需要一个执行以下操作的XPath表达式:
- 如果上下文节点是而不是第一个子节点,则返回空白
- 如果上下文节点是第一个子节点,则表达式应返回文档中其他位置的"temp"节点的值
- 在本例中,该值为
<my:DisplayNameTemp>Green, John</my:DisplayNameTemp>
- 在本例中,该值为
- InfoPath仅支持XPath 1.0,不支持"Position"表达式
- 我正在使用MS InfoPath,如果检测到多个子节点,将使用规则应用此表达式
如果选择了多个用户,我将尝试在MS InfoPath中清空人员选取器。这是我的示例XML:
<?xml version="1.0" encoding="UTF-8"?><?mso-infoPathSolution solutionVersion="1.0.0.24" productVersion="14.0.0" PIVersion="1.0.0.0" href="file:///C:Documents%20and%20SettingsChrisLocal%20SettingsApplication%20DataMicrosoftInfoPathDesigner335e8a7eff4a841a9manifest.xsf" ?><?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?>
<my:myFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls" xmlns:ma="http://schemas.microsoft.com/office/2009/metadata/properties/metaAttributes" xmlns:d="http://schemas.microsoft.com/office/infopath/2009/WSSList/dataFields" xmlns:q="http://schemas.microsoft.com/office/infopath/2009/WSSList/queryFields" xmlns:dfs="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" xmlns:dms="http://schemas.microsoft.com/office/2009/documentManagement/types" xmlns:tns="http://microsoft.com/webservices/SharePointPortalServer/UserProfileService" xmlns:s1="http://microsoft.com/wsdl/types/" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-09-06T15:09:43" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="en-us">
<my:group>
<pc:Person xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls">
<pc:DisplayName>Green, John</pc:DisplayName>
<pc:AccountId>DOMAINJohn.Green</pc:AccountId>
<pc:AccountType>User</pc:AccountType>
</pc:Person><pc:Person xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls">
<pc:DisplayName>Smith, John</pc:DisplayName>
<pc:AccountId>DOMAINjohn.smith</pc:AccountId>
<pc:AccountType>User</pc:AccountType></pc:Person>
<pc:Person xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls">
<pc:DisplayName>Public, John</pc:DisplayName>
<pc:AccountId>DOMAINJohn.Q.Public</pc:AccountId>
<pc:AccountType>User</pc:AccountType>
</pc:Person><pc:Person xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls">
<pc:DisplayName>Doe, John</pc:DisplayName>
<pc:AccountId>DOMAINJohn.Doe</pc:AccountId>
<pc:AccountType>User</pc:AccountType></pc:Person>
</my:group>
<my:DisplayNameTemp>Green, John</my:DisplayNameTemp>
<my:AccountIdTemp>DOMAINJohn.Green</my:AccountIdTemp>
<my:AccountTypeTemp>User</my:AccountTypeTemp>
</my:myFields>
如果除第一个子项外,我可以为所有子项返回一个"空白"值,那么在用户将焦点从选择器上移开后,选择器将重新验证,并且只存在一个用户名。
我可以使用以下表达式来检索使用选择器选择的第一个用户://my:group/pc:Person[1]/pc:DisplayName
。
- 我相信我需要一个表达式,它使用
|
命令和上面提到的第一个孩子的表达式,或者简单地使用"来表示其他任何东西 我相信,在不使用任何位置表达式的情况下,检查前一个同级中是否存在节点可能会发现哪个节点是第一个。
我不能把它拼凑起来。
使用:
concat($yourTempNode[not($yourContextNode/preceding-sibling::*)],
substring(' ', 1 + boolean($yourContextNode/preceding-sibling::*))
)
concat()
的第一个自变量是$yourTempNode
的值——如果$yourContextNode
没有前面的同级元素或没有其他元素。
第二个参数是cpace字符——如果$yourContextNode
不是其父元素或其他元素的第一个子元素,则什么也不向导。