Использование XPath для поиска узла в файле XML с пользовательским шаблоном HelpNDoc
Я пытаюсь улучшить свой 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 я попытался скомпилировать скрипт, но получил следующие ошибки:
Поэтому я не уверен, смогу ли я сделать то, что хочу, если я не пропустил некоторые шаги.
1 ответ
Я получил эту обратную связь от авторов программного обеспечения:
Пожалуйста, знайте, что механизм сценариев 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
глобальная переменная. Затем я читаю в файле данных в этот список только один раз и использую его при создании метаописаний. Наконец, я освобождаю список к концу процесса сборки в файле сценария.