始终使用XPath从当前节点返回元素值

时间:2012-09-20 20:29:08

标签: xml xpath infopath

编辑:此问题应为"如何指向上下文节点中的元素?"在这种情况下,答案很简单。来自Larsh的回复: "my:Line_Item_Mod_0 = 'true'"

另外,如果这是一个非常明显的问题,请原谅我;我不知道" Context Node"的术语。这可能是谷歌和StackOverflow搜索没有多大帮助的原因。

阅读问题的其余部分以获取上下文。

我需要一个XPath表达式,它返回每个节点中的当前Line_Item_Mod_0值,以便有条件地格式化MS InfoPath表单。我对XPath非常环保,我不知道这种行为的适当术语(由表达式表示)是什么。这是我的XML:

<?xml version="1.0" encoding="UTF-8"?><?mso-infoPathSolution solutionVersion="1.0.0.504" productVersion="14.0.0" PIVersion="1.0.0.0" href="file:///C:\Documents%20and%20Settings\Chris\Local%20Settings\Application%20Data\Microsoft\InfoPath\Designer3\c37482678ae440c9\manifest.xsf" ?><?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?><?mso-infoPath-file-attachment-present?>
<my:myFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:dfs="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-05-05T19:56:08" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="en-us">
<my:MasterSection>
    <my:Project_Information>
        <my:Line_Items>
            <my:Counter>1</my:Counter>
            <my:Authorized_Number>4</my:Authorized_Number>
            <my:XPathLINCounter>Line Item 1</my:XPathLINCounter>
            <my:Line_Item_Mod_0>false</my:Line_Item_Mod_0>
        </my:Line_Items>
        <my:Line_Items>
            <my:Counter>2</my:Counter>
            <my:Authorized_Number>7</my:Authorized_Number>
            <my:XPathLINCounter>Line Item 2</my:XPathLINCounter>
            <my:Line_Item_Mod_0>true</my:Line_Item_Mod_0>
        </my:Line_Items>
        <my:Line_Items>
            <my:Counter>3</my:Counter>
            <my:Authorized_Number>2</my:Authorized_Number>
            <my:XPathLINCounter>Line Item 3</my:XPathLINCounter>
            <my:Line_Item_Mod_0>false</my:Line_Item_Mod_0>
        </my:Line_Items>
    </my:Project_Information>
</my:MasterSection>
</my:myFields>

我正在尝试评估&#34; mod&#34;当前节点的值是1或0.我已经有一个表达式来执行此操作,但由于某种原因,InfoPath条件格式不喜欢它。您可以在Line_Item_Mod_0元素中看到此mod表达式的结果。

我需要做的就是定位每个Line_Item_Mod_0节点中的Line_Items元素。我似乎无法创建一个表达式,为其父节点返回Line_Item_Mod_0的值(或者可能&#34;当前&#34;是正确的术语)。

即。 Line_Items节点1将在其中包含一个表达式,始终返回false Line_Item_Mod_0的值。

我意识到这应该很简单,但我似乎无法将我的表达式保留在当前节点内。

表达式(count(preceding-sibling::my:*) + 1) mod 2 > 0会生成Line_Item_Mod_0节点,但如果我将其作为规则应用,则对条件格式不起作用。我不知道为什么。

我想试图绕过它并评估&#34; true&#34;或&#34;假&#34;价值直接。

1 个答案:

答案 0 :(得分:1)

每当当前节点(上下文节点)是<my:Line_Items>元素时,以下XPath表达式将返回其<my:Line_Item_Mod_0>子元素的值:

"my:Line_Item_Mod_0"

这个XPath表达式实际上会选择一个元素节点;如果在字符串上下文中评估该元素节点,则其值将是其子文本节点falsetrue的字符串内容。如果需要将其转换为布尔值,请使用

"my:Line_Item_Mod_0 = 'true'"

但请注意,此XPath表达式使用名称空间前缀。为了使该用法有效,您必须在XPath处理器的上下文中声明该命名空间前缀。您没有显示任何调用XPath的上下文,但如果您确实向我们展示了这一点,我们应该能够帮助验证该部分是否正确完成。

你也提到了几次“条件格式化”,但是没有足够的细节来做任何事情。我现在认为它不重要,但如果它很重要,请编辑你的答案来发布例子,以便我们为你提供帮助。