Вернуть начальное значение или самое последнее вхождение с помощью 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 становятся все более и более сложными.

Другие вопросы по тегам