Использование XPath для поиска узла в файле XML с пользовательским шаблоном HelpNDoc - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь улучшить свой HTML-шаблон, который используется с HelpNDoc. Мне не хватает одного факта, что тег meta description одинаков для всех страниц.

Файл шаблона представляет собой смесь паскаля и HTML. На данный момент это данные в шаблоне для отображения тега описания:

<meta name="description" content="<% print(HndProjects.GetProjectSummary()); %>" />

Я создал картографический XML-документ, который содержит необходимые описания. Пример:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<HelpTopics xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Topic>
        <Caption>Overview</Caption>
        <ID>msa-overview</ID>
        <ContextID>0</ContextID>
        <Description>An introduction to Meeting Schedule Assistant.</Description>
    </Topic>
    <Topic>
        <Caption>Quick Start - Getting Started</Caption>
        <ID>msa-quick-start</ID>
        <ContextID>1</ContextID>
        <Description>A quick start guide to get you up and running with Meeting Schedule Assistant.</Description>
    </Topic>
    <Topic>
        <Caption>Using Meeting Schedule Assistant</Caption>
        <ID>msa</ID>
        <ContextID>2</ContextID>
        <Description>An overview of the menus in Meeting Schedule Assistant.</Description>
    </Topic>
</HelpTopics>

Возможно ли использовать pascal внутри этого скрипта HelpnDoc для чтения XML-файла? На своем сайте они предоставляют подробную информацию о HndProjects и упоминает:

function GetProjectId: string;

Возвращает текущий открытый идентификатор проекта.

Итак, я бы хотел получить это значение из файла данных XML:

HelpTopics/Topic/ID[text()='<% HndProjects.GetProjectId(); %>'

Но я не знаю, как использовать такой XPath со скриптом HelpNDoc Pascal.

Обновление

Я попытался добавить этот код, чтобы начать:

function GetDescription(sTopicID: string): String;
var
    nodeTopic: TDOMNode;
    doc: TXMLDocument;
begin
    try
        // Read in the xml file
        ReadXMLFile(doc, '.\MSA-Help-Descriptions.xml');
        // Get the node
        //nodeTopic := doc.DocumentElement.FindNode(
        // How do we get the node at:  HelpTopics/Topic/ID[text()=sTopicID];
    finally
        doc.Free;
    end;
    GetDescription := 'xxxx';
end;

Затем внутри HelpNDoc я попытался скомпилировать скрипт, но получил следующие ошибки:

Log

Так что я не уверен, смогу ли я даже сделать то, что я хочу, если я не пропустил некоторые шаги.

1 Ответ

0 голосов
/ 28 июня 2018

Я получил эту обратную связь от авторов программного обеспечения:

Пожалуйста, знайте, что механизм сценариев HelpNDoc является лишь подмножеством языка Паскаль и библиотек. На языке сценариев нет доступных библиотек XML. Может быть возможно использовать стороннюю библиотеку XML, но это не то, что мы тестировали или поддерживаем.

Мы рекомендуем вам работать с более простыми структурами, которые могут быть легко проанализированы с помощью простого кода, такого как файлы, разделенные запятыми (CSV).

Поэтому я создал простой текстовый файл, в котором каждая строка представляет мета-описание, а номер строки соответствует идентификатору контекста раздела справки.

Затем я изменил скрипт на паскале, который используется для компиляции:

function ReadFile(helpContextID: integer): string;
var
    FText  : TStringList;
begin
    FText := TStringList.Create;
    try
       FText.LoadFromFile('D:\My Programs\2017\MeetSchedAssist\HelpNDoc\HelpTopicDescriptions.txt');
       result := FText[helpContextID];
    finally
       FText.Free;
    end;
end;

Наконец, я сделал следующий вызов, чтобы установить мета-описание:

<meta name="description" content="<% print(ReadFile(HndTopics.GetTopicHelpContext(HndGeneratorInfo.CurrentTopic))); %>" />

Обновление

Для чего бы то ни было, я улучшил код, сделав TStringList глобальной переменной. Затем я читаю в файле данных в этот список только один раз и использую его при создании мета-описаний. Наконец, я освобождаю список к концу процесса сборки в файле сценария.

...