Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如果上下文节点是第一个子节点,则返回值的XPath表达式_Xml_Xpath_Infopath - Fatal编程技术网

Xml 如果上下文节点是第一个子节点,则返回值的XPath表达式

Xml 如果上下文节点是第一个子节点,则返回值的XPath表达式,xml,xpath,infopath,Xml,Xpath,Infopath,我需要执行以下操作的XPath表达式: 如果上下文节点不是第一个子节点,则返回空白 如果上下文节点是第一个子节点,则表达式应返回文档中其他位置的“temp”节点的值 在本例中,该值将为绿色,John InfoPath仅支持XPath 1.0,不支持“位置”表达式 我正在使用MS InfoPath,如果检测到多个子节点,我将使用规则应用此表达式 如果选择了多个用户,我将尝试在MS InfoPath中清空人员选取器。以下是我的示例XML: <?xml version="1.0" enc

我需要执行以下操作的XPath表达式:

  • 如果上下文节点不是第一个子节点,则返回空白
  • 如果上下文节点是第一个子节点,则表达式应返回文档中其他位置的“temp”节点的值
    • 在本例中,该值将为
      绿色,John
  • InfoPath仅支持XPath 1.0,不支持“位置”表达式
  • 我正在使用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>

格林,约翰
域\John.Green
使用者
史密斯,约翰
域\john.smith
使用者
公开,约翰
域\John.Q.Public
使用者
多伊,约翰
域\John.Doe
使用者
格林,约翰
域\John.Green
使用者
如果我可以为除第一个子项以外的所有子项返回一个“空白”值,那么在用户将焦点从拾取项上移开后,拾取项将重新验证,并且只有一个用户名将出现

我可以使用以下表达式检索使用选择器选择的第一个用户:
//my:group/pc:Person[1]/pc:DisplayName

  • 我相信我需要一个表达式,它使用
    |
    命令,上面提到的表达式用于第一个孩子,或者简单地用一个“”表示其他任何东西
  • 我相信,检查前一个兄弟节点中是否存在节点可能会发现哪个节点是第一个节点,而不使用任何位置表达式

    我不能把它拼凑起来

    • 使用

      concat($yourTempNode[not($yourContextNode/preceding-sibling::*)], 
             substring(' ', 1 + boolean($yourContextNode/preceding-sibling::*))
             )
      
      concat()
      的第一个参数是
      $yourTempNode
      的值——如果
      $yourContextNode
      没有前面的同级元素,或者没有其他元素


      第二个参数是一个cpace字符——如果
      $yourContextNode
      不是其父元素的第一个子元素,或者其他元素不包含任何内容。

      Chris-这里的上下文节点到底是什么?什么的“第一个孩子”?Chris,如果“位置表达式”不受支持,那么XPath 1.0就不受支持。@Jwiley很抱歉缺少上下文;此表达式旨在“封装”为MS InfoPath中
      displayname
      节点的默认值。然后,MS InfoPath将使用此表达式的返回值并将其放置在
      displayname
      节点中。我希望这有助于澄清@DimitreNovatchev MS InfoPath仅支持XPath的某些方面。。。你得问问他们。