2012-09-25 40 views
0

編輯:雖然這個問題的答案(!感謝湯姆)是技術上從XPath的角度來看是正確的,MS的InfoPath沒有發揮好與人民選擇器。請注意,這不會讓您清除人員選取器並重新分配第一個選定的人員。在人員選擇器已被重新驗證後,InfoPath僅清除預先存在的XML結構。這意味着將應用程序關注於拾取器,然後切換回來。由於MS InfoPath的技術限制,我的最終目標似乎無法完成。在那裏,我希望這證明對其他一些新手有用!XPath表達式中重複父節點選擇元素的第一個實例

問題:我需要選擇重複的父節點中的節點或元素的第一個實例。 (我的術語可能不正確)。試圖從其他帖子適應表達式在這裏stackoverflow無濟於事。

基本情況:使用MS InfoPath中的Person/Group選取器。如果有人在picker字段中選擇多個用戶,我想將其重置爲第一個選定的用戶。問題是表單上有多個選擇器使用類似的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> 

下面的表達式返回域\ John.Green和DOMAIN \和John.Smith ...

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

關閉,但沒有雪茄。

我需要兩個單獨的表達式;一個選擇DOMAIN \ John.Green,另一個選擇DOMAIN \ John.Q.Public。

+0

怎麼樣'//我:SECTION1 /我:group/pc:Person [1]/pc:DisplayName'或'// */my:group/pc:Person [1]/pc:DisplayName'(這個可以一次從所有部分選擇) – toniedzwiedz

+0

@Tom Hey throw throw作爲答案,我會給你信用!我很驚訝這是多麼簡單;我應該自己想想吧!再次感謝:) – Shrout1

回答

2

你在錯誤的地方使用謂詞。

你的表達,

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

返回一組pc:DisplayName元素都在其相應的父母(pc:Person元素)首當其衝的,所以你得到DOMAIN\John.GreenDOMAIN\john.smith

它基本上首先DisplayNamePersongroupsection1

你想要的是在每個section1每個group,轉化爲下面的XPath表達式的第一PersonDisplayName/descendant::my:section1/my:group/pc:Person[1]/pc:DisplayName

+0

thnx你救了我的一天! – Rahul

相關問題