Индексирование элементов узла XPath на основе атрибута - PullRequest
2 голосов
/ 19 февраля 2009

Я пытаюсь создать форму Infopath, которая заполняет поля данными из списка Sharepoint. Я установил раскрывающийся список, значения которого заполняются из источника данных Sharepoint. Эта часть отлично работает. Теперь я хочу, чтобы другие строковые поля автоматически заполнялись, когда пользователь выбирает один из элементов в списке.
Поэтому я установил правило для этого. Я написал формулу XPath, чтобы получить атрибут из списка Sharepoint

xdXDocument:GetDOM("Base Printers")
/dfs:myFields/dfs:dataFields/dfs:Base_Printers/@PNP_String

Проблема в том, что при этом всегда захватывается атрибут (PNP_String) из первого элемента в списке. Я хочу заполнить его соответствующим принтером (Base_Printers) на основе выбора пользователя. Поэтому я должен индексировать в Base_Printers, а затем выбрать PNP_String. Итак, я попробовал это

.../dfs:Base_Printers[2]/@PNP_String

Он будет проиндексирован во 2-й элемент и вернет эту строку PNP, что здорово!
Но мне нужно проиндексировать элемент, который выбрал пользователь, поэтому я попробовал это:

.../dfs:Base_Printers[@Printer=my:basePrinter]/@PNP_String

Где @Printer - это атрибут в списке sharepoint, а my: basePrinter - локальная переменная infopath в раскрывающемся списке. И это ничего не делает для меня. Когда я попробовал буквальное значение:

.../dfs:Base_Printers[@Printer='XYZ']/@PNP_String

Он выбрал правильную строку pnp.
Поэтому мой вопрос: как я могу индексировать этот массив принтеров на основе выбора пользователя?

Спасибо

Ответы [ 2 ]

1 голос
/ 19 февраля 2009

Кажется, я понял это.

xdXDocument:GetDOM("Base Printers")/dfs:myFields/dfs:dataFields
/dfs:Base_Printers[@Printer = current()]/@PNP_String

По какой-то странной причине он работает, когда вы используете:

@Printer = current()

Но не тогда, когда вы используете:

@Printer = my:basePrinter

Даже если current () и my: basePrinter возвращают одну и ту же строку.

Weirdness ...

0 голосов
/ 19 февраля 2009

По умолчанию XPath не наследует контекст (например, локальные переменные infopath) от окружающей среды.

В XSLT процессор должен предоставить механизм, позволяющий вам заполнять глобальные (то есть определенные в корневом узле) объявления xsl: variable, которые затем доступны в XPath как $ name.

Поскольку я не знаю InfoPath, я не могу быть более конкретным, но это должно быть задокументировано (даже если только косвенно с помощью примеров) ...

Также обратите внимание, что вы можете использовать в предикатах (внутри []) полные пути расположения с их собственными предикатами, поэтому, если выбранное значение доступно в том же документе, вы можете использовать его, например,

.../dfs:base_printers[@printer=/theform/theCombo/Values[@selected=true]]
...