1

次のことを行う 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%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: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>
        <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:DisplayNameTemp>Green, John</my:DisplayNameTemp>
    <my:AccountIdTemp>DOMAIN\John.Green</my:AccountIdTemp>
    <my:AccountTypeTemp>User</my:AccountTypeTemp>
</my:myFields>

最初の子以外のすべてに対して「空白」の値を返すことができれば、ユーザーがピッカーからフォーカスを外した後にピッカーが再検証され、ユーザー名が 1 つだけ表示されます。

次の式を使用して、ピッカーで選択された最初のユーザーを取得できます: //my:group/pc:Person[1]/pc:DisplayName.

  • |最初の子にはコマンドと上記の式を使用する式、または単に ""を使用する式が必要だと思います。
  • 前の兄弟のノードの存在を確認すると、位置式を使用せずにどのノードが最初であるかがわかる可能性があると思います。

    私はそれをうまくまとめることができません。

4

1 に答える 1

0

使用

concat($yourTempNode[not($yourContextNode/preceding-sibling::*)], 
       substring(' ', 1 + boolean($yourContextNode/preceding-sibling::*))
       )

の最初の引数は--concat()の値です。前に兄弟要素がない場合、またはそれ以外の場合は何もありません。$yourTempNode$yourContextNode

2番目の引数はcpace文字です-$yourContextNodeが親の最初の子要素でない場合、またはそれ以外の場合は何もしません。

于 2012-09-26T14:35:44.637 に答える