0

编辑:虽然从 XPath 的角度来看,这个问题的答案(感谢 Tom!)在技术上是正确的,但 MS InfoPath 不能很好地与 People Picker 配合使用。请注意,这将不允许您清除人员选择器并重新分配第一个选择的人员。InfoPath 仅在人员选取器重新验证后才清除预先存在的 XML 结构。这意味着将应用程序焦点从选择器上移开,然后再切换回来。由于 MS InfoPath 的技术限制,我的最终目标似乎无法实现。在那,我希望这对其他一些新手有用!

问题:我需要在重复的父节点中选择节点或元素的第一个实例。(我的术语可能不正确)。尝试在stackoverflow上调整其他帖子中的表达式无济于事。

基本情况:在 MS InfoPath 中使用人员/组选择器。如果有人在选择器字段中选择了多个用户,我想将其重置为第一个选择的用户。问题是表单上有多个选择器使用类似的 XML 结构,所以我的 XPath 不起作用......

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%20Settings\Chris\Local%20Settings\Application%20Data\Microsoft\InfoPath\Designer3\35e8a7eff4a841a9\manifest.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:section1>
    <my:group>
        <pc:Person xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls">
            <pc:DisplayName>Green, John</pc:DisplayName>
            <pc:AccountId>DOMAIN\John.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>DOMAIN\john.smith</pc:AccountId>
            <pc:AccountType>User</pc:AccountType></pc:Person>
    </my:group>
</my:section1>
<my:section2>
    <my:group>
        <pc:Person xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls">
            <pc:DisplayName>Public, John</pc:DisplayName>
            <pc:AccountId>DOMAIN\John.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>DOMAIN\John.Doe</pc:AccountId>
            <pc:AccountType>User</pc:AccountType></pc:Person>
    </my:group>
</my:section2>
</my:myFields>

以下表达式同时返回DOMAIN\John.Green 和 DOMAIN\John.Smith...

/descendant::my:section1/my:group/pc:Person/pc:DisplayName[1]

关闭但没有雪茄。

我需要两个单独的表达式;一种选择 DOMAIN\John.Green,另一种选择 DOMAIN\John.Q.Public。

4

1 回答 1

2

您在错误的地方使用了谓词。

你的表情,

/descendant::my:section1/my:group/pc:Person/pc:DisplayName[1]

返回一组pc:DisplayName元素,它们是其对应父级(pc:Person元素)中的第一个元素,因此您可以得到DOMAIN\John.GreenDOMAIN\john.smith

它基本上是每个DisplayName一个Persongroupsection1

您想要的是每个 eachDisplayNamePerson一个,它转换为以下 XPath 表达式: groupsection1/descendant::my:section1/my:group/pc:Person[1]/pc:DisplayName

于 2012-09-25T16:50:59.763 回答