Beunens Filip Ответов: 1

MS word XML mapping, повторяющийся раздел управления


Привет,

У меня есть тема MS Word (2016), и я сопоставил XML-файл с элементами управления содержимым в таблице, также используя повторяющийся элемент управления. Это работает нормально, но теперь я хотел бы отфильтровать сопоставленные XML-данные в повторяющемся элементе управления.

Скажем, у меня есть этот XML-файл

<?xml version="1.0" encoding="utf-8"?>
<books>
  <book>
    <title>Word Programmierung</title>
    <authors>
      <author>Cindy Meister</author>
      <author>Christian Freßdorf</author>
    </authors>
    <publisher>Microsoft Press</publisher>
    <isbn>000</isbn>
  </book>
  <book>
    <title>XML Pocket Consultant</title>
    <authors>
      <author>William Stanek</author>
    </authors>
    <publisher>Microsoft Press</publisher>
    <isbn>111</isbn>
  </book>
   <book>
    <title>.NET Development for Office</title>
    <authors>
      <author>Andrew Whitechapel</author>
    </authors>
    <publisher>Microsoft Press</publisher>
    <isbn>111</isbn>
  </book>
    <book>
    <title>Visual Studio Tools for Office 2007</title>
    <authors>
      <author>Eric Carter</author>
      <author>Eric Lippert</author>
    </authors>
    <publisher>Addison Wesley</publisher>
    <isbn>000</isbn>
  </book>
</books>


и я использую этот код для отображения

Set rng = doc.Tables(1).Rows(2).Range
    doc.SelectContentControlsByTitle("Title").Item(1).XMLMapping.SetMapping _
      "//title"
    doc.SelectContentControlsByTitle("Publisher").Item(1).XMLMapping.SetMapping _
      "//publisher"
    doc.SelectContentControlsByTitle("ISBN").Item(1).XMLMapping.SetMapping _
      "//isbn"
    doc.SelectContentControlsByTitle("Author").Item(1).XMLMapping.SetMapping _
      "//author"
    doc.SelectContentControlsByTitle("Authors").Item(1).XMLMapping.SetMapping _
      "//authors/author"
    Set ccRepSec = rng.ContentControls.Add(Word.WdContentControlType.wdContentControlRepeatingSection, rng)
    ccRepSec.XMLMapping.SetMapping "//books/book[./isbn = '000']"
    MapContentControls = True


Строка Xpath "//books/book[./isbn = '000']" должна давать только 2 книги, но вместо этого в документе возвращаются все 4 книги.

Что я уже пробовал:

Я протестировал Xpath на своем XML-файле, и это правильно, поэтому думаю, что это не тот способ фильтровать отображение на повторяющемся элементе управления в MS Word

1 Ответов

Рейтинг:
9

Aaron Queenan

Немного поздно помогать оригинальному плакату, но на случай, если кто-то еще найдет эту статью, вот объяснение проблемы.

Хотя другие элементы управления содержимым поддерживают стандартный синтаксис xpath (MSXML3), повторяющийся элемент управления содержимым раздела поддерживает только очень простой синтаксис XPath, позволяя только / (корневой селектор), имя элемента и предикат индекса [n], а конечное имя элемента не может иметь индекса. Даже длинная форма индексного предиката [position() = n] не поддерживается.

Если вы используете какой-либо недопустимый XPath, Word либо игнорирует недопустимую часть, либо возвращает ошибку, в зависимости от того, как вы ее настроили, поэтому в конечном итоге обрабатывает //books/book[./isbn = '000'] как /books[1]/book.

Я подозреваю, что причина, по которой сложные XPath не разрешены, заключается в том, как реализуется управление содержимым повторяющегося раздела: удаление последнего элемента (например, путем установки предиката в false) также удаляется шаблон.