Вернуть начальное значение или самое последнее вхождение с помощью XPath, затем запустить оператор
У меня есть следующее выражение XPath 1.0 в MS InfoPath (я опубликую сопроводительный XML):
//my:Value_Modifier_Group[1=count(following-sibling::my:Value_Modifier_Group)]//my:Modified_Start_Value[(text())] | //my:Start_Value[text() and not(//my:Value_Modifier_Group[1=count(following-sibling::my:Value_Modifier_Group)]//my:Modified_Start_Value[(text()])]
Если есть начальное значение и нет "Модифицированного значения", тогда возвращается начальное значение. Если присутствует измененное значение, оно возвращается.
Мне нужно вернуть это значение и затем выполнить следующие операции над ним:
number(//my:Value_Modifier_Group[1=count(following-sibling::my:Value_Modifier_Group)]//my:Modfied_Start_Value) + number(//my:Value_Modifier_Group[0=count(following-sibling::my:Value_Modifier_Group)]//my:Start_Value_Increase) - number(//my:Value_Modifier_Group[0=count(following-sibling::my:Value_Modifier_Group)]//my:Start_Value_Decrease)
Эта операция добавляет или вычитает значение увеличения / уменьшения. Проблема в том, что это выражение возвращает NaN, если нет Modified_Start_Value
настоящее. Отлично работает в противном случае.
Мне нужно объединить оба эти выражения в одно выражение XPath.
- Если
Modified_Start_Value
имеет предшествующее значение, используйте это в операциях - Если
Modified_Start_Value
не имеет предшествующего значения, тогда используйтеStart_Value
в операциях вместо - Важно, чтобы я всегда использовал "предыдущее" значение, потому что предыдущее значение является фиксированным. Он действует как ориентир или отправная точка.
Вот образец XML, который я использую:
<?xml version="1.0" encoding="UTF-8"?><?mso-infoPathSolution solutionVersion="1.0.0.2" productVersion="14.0.0" PIVersion="1.0.0.0" href="file:///C:\Documents%20and%20Settings\Chris\Local%20Settings\Application%20Data\Microsoft\InfoPath\Designer3\ef41a19775b4ce0\manifest.xsf" ?><?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.3"?>
<my:myFields xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-09-19T13:28:35" xml:lang="en-us">
<my:Start_Value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">6</my:Start_Value>
<my:Main_Group>
<my:Value_Modifier_Group>
<my:Modified_Start_Value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">6</my:Modified_Start_Value>
<my:Start_Value_Increase>0</my:Start_Value_Increase>
<my:Start_Value_Decrease>0</my:Start_Value_Decrease>
</my:Value_Modifier_Group>
<my:Value_Modifier_Group>
<my:Modified_Start_Value>6</my:Modified_Start_Value>
<my:Start_Value_Increase>0</my:Start_Value_Increase>
<my:Start_Value_Decrease>0</my:Start_Value_Decrease>
</my:Value_Modifier_Group></my:Main_Group>
</my:myFields>
Надеюсь, этот вопрос не слишком спешно сложен! Сегодня занятой день...
1 ответ
Хорошо, я собираюсь самостоятельно ответить на этот вопрос, поскольку я только что понял это.
Ключ заключается в том, чтобы объединить выражения XPath, поместив значение из первого выражения в узел, а затем сослаться на этот узел во втором выражении.
Кажется, что команда труба | плохо играет с другими операторами.
Следующее выражение возвращает значения следующим образом:
//my:Value_Modifier_Group[1=count(following-sibling::my:Value_Modifier_Group)]//my:Modified_Start_Value[(text())] | //my:Start_Value[text() and not(//my:Value_Modifier_Group[1=count(following-sibling::my:Value_Modifier_Group)]//my:Modified_Start_Value[(text()])]
- Если нет предыдущего
Modified_Start_Value
доступно до первогоModified_Start_Value
узел выражения по умолчанию принимает начальное значение. - Таким образом, вам гарантирован самый последний действительный
Start_Value
или жеModified_Start_Value
Это значение этого выражения затем помещается в узел под названием StartVModStart
, Затем XPath для этого узла помещается в выражение оценки:
../../../my:StartVModStart + number(/descendant-or-self::node()/my:Value_Modifier_Group[0 = count(following-sibling::my:Value_Modifier_Group)]//my:Start_Value_Increase) - number(/descendant-or-self::node()/my:Value_Modifier_Group[0 = count(following-sibling::my:Value_Modifier_Group)]//my:Start_Value_Decrease)
- Это выражение использует "самое последнее" значение, а затем добавляет или вычитает изменения
Таким образом, можно сохранить "промежуточную сумму" по ходу документа, начиная с начального узла и продвигаясь полностью через повторяющиеся узлы.
Этот вопрос кажется очень запутанным, поэтому простите меня, если мой вопрос и ответ не кажутся ясными. Поскольку я достигаю более сложной функциональности, требуемые выражения XPath становятся все более и более сложными.