Преобразования SlowCheetah конфигурации QuartzNet

Я пытаюсь настроить преобразование с помощью SlowCheetah файла конфигурации задания QuartzNet. QuartzNet требует, чтобы атрибут xmlns присутствовал на узле данных планирования заданий, но наличие этого атрибута, по-видимому, не позволяет SlowCheetah выполнять преобразования.

Упрощенно, вот как выглядит моя конфигурация планирования:

<?xml version="1.0" encoding="UTF-8"?>
  <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
<schedule>
<job>
  <name>Job1</name>
  <group>Group1</group>
  <description>Description</description>
  <job-type>MySample.MyJob, MySample</job-type>
</job>

<trigger>
  <cron>
    <name>DefaultTrigger</name>
    <job-name>Job1</job-name>
    <job-group>Group1</job-group>
    <cron-expression>0 0 4 * * ? *</cron-expression>
    <time-zone>GMT Standard Time</time-zone>
  </cron>
</trigger>
</schedule>
</job-scheduling-data>

Преобразование конфига выглядит так:

<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" >
<cron-expression xdt:Transform="Replace" xdt:Locator="XPath(/job-scheduling-data/schedule/trigger/cron/cron-expression[../name/text() = 'DefaultTrigger'])">"##DAILY_SCHEDULE##</cron-expression>
</job-scheduling-data>

Преобразование не работает, если я не удалю

xmlns="http://quartznet.sourceforge.net/JobSchedulingData" 

из исходного файла конфигурации и файла преобразования или указать пространство имен, например, xmlns:ns1. Проблема с любым из этих двух подходов заключается в том, что Quartz требует присутствия xmlns="http://quartznet.sourceforge.net/JobSchedulingData".

Я также пытался использовать выражения XPath с local-name(), пытаясь игнорировать пространство имен в синтаксисе выражения, но безрезультатно.

Любые идеи, как обойти это?


person Øyvind    schedule 16.06.2014    source источник


Ответы (1)


Мне кажется, что ваше выражение XPath должно быть:

/job-scheduling-data/schedule/trigger/cron/cron-expression[../job-name/text() = 'Job1']

Поскольку он соответствовал name, а не job-name.

Страшное выражение XPath, игнорирующее пространство имен, приведенное ниже, также должно работать:

/*[local-name()='job-scheduling-data']/*[local-name()='schedule']/*[local-name()='trigger']/*[local-name()='cron']/*[local-name()='cron-expression'][../*[local-name()='job-name']/text() = 'Job1']
person helderdarocha    schedule 16.06.2014
comment
Привет. Нет узла с именем «имя задания»? - person Øyvind; 16.06.2014
comment
В пути, который вы используете, есть один. Возможно, вам действительно нужен /job-scheduling-data/schedule/job, где есть элемент name и нет job-name. - person helderdarocha; 16.06.2014
comment
Или, возможно, ваш предикат должен сравниваться с использованием соответствия name, который является дочерним элементом элемента job. Если это так, то это будет /job-scheduling-data/schedule/trigger/cron/cron-expression[../../../job/name/text() = 'Job1'] - person helderdarocha; 16.06.2014
comment
Извините, я идиот :-) Я обновил XML преобразования, чтобы правильно отразить, что я сопоставляю имя, которое является дочерним элементом cron. В любом случае - я попробовал предложенное вами выражение XPath, игнорирующее пространство имен, и это не сработало. Но при ближайшем рассмотрении я использовал разные регистры слов в исходном XML и в моем выражении XPath... и это оказалось проблемой. Ваше выражение, игнорирующее пространство имен, действительно действительно работает :-) Спасибо! - person Øyvind; 16.06.2014
comment
@helderdarocha первое выражение XPath не сработало, но второе (без учета пространства имен) сработало. - person Attiqe; 01.01.2019