4

您好我正在尝试<cron-expression>通过在quartz.net 作业描述文件上使用以下转换来替换使用VS2012 XDT。我已经使用在线测试器测试了 XPath 定位器,它返回“我认为我需要的东西”。任何帮助表示赞赏。

<schedule>
    <trigger>
        <cron xdt:Locator="XPath(//job-scheduling-data/schedule/trigger/cron[name='crontriggername2'])" >
            <cron-expression  xdt:Transform="Replace">***some data***</cron-expression>
        </cron>
    </trigger>
</schedule>

对于示例 XML 文件 (Quartz.net)

  <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"><processing-directives>
    <overwrite-existing-data>true</overwrite-existing-data>
</processing-directives>

<schedule>
       <trigger>
        <cron>
            <name>crontriggername1</name>
            <group>crontriggergroup1</group>
            <description>crontriggerdesc1</description>
            <job-name>crontriggerjobname1</job-name>
            <job-group>crontriggerjgroup1</job-group>
            <misfire-instruction>crontriggermisfile1</misfire-instruction>
            <cron-expression>0/5 * * * * ?</cron-expression>
        </cron>
    </trigger>

    <trigger>
        <cron>
            <name>crontriggername2</name>
            <group>crontriggergroup2</group>
            <description>crontriggerdesc2</description>
            <job-name>crontriggerjobname2</job-name>
            <job-group>crontriggerjgroup2</job-group>
            <misfire-instruction>crontriggermisfile2</misfire-instruction>
            <cron-expression>0/13 * * * * ?</cron-expression>
        </cron>
    </trigger>      
</schedule>

XPath //job-scheduling-data/schedule/trigger/cron[name='crontriggername2']

返回我正确的元素组(http://www.freeformatter.com/xpath-tester.html 1

<cron>
  <name>crontriggername2</name>
  <group>crontriggergroup2</group>
  <description>crontriggerdesc2</description>
  <job-name>crontriggerjobname2</job-name>
  <job-group>crontriggerjgroup2</job-group>
  <misfire-instruction>crontriggermisfile2</misfire-instruction>
  <cron-expression>0/13 * * * * ?</cron-expression>
</cron>

我将表达式基于 Log4net 上另一个 XDT 问题的解决方案(log4Net 配置转换

谁能指出我正确的解决方案,这让我发疯。提前致谢。

4

4 回答 4

5

An alternative solution that does not need any modifications to the original file is

<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<schedule>
    <trigger>


        <cron xdt:Locator="XPath(//*[local-name()='job-scheduling-data']
                                 /*[local-name()='schedule']
                                 /*[local-name()='trigger']
                                 /*[local-name()='cron']
                                   [*[local-name() = 'name'] = 'MyTriggerName'])">

or this syntax...

        <cron xdt:Locator="XPath(//*[local-name()='job-scheduling-data' and namespace-uri()='http://quartznet.sourceforge.net/JobSchedulingData']
                                 /*[local-name()='schedule' and namespace-uri()='http://quartznet.sourceforge.net/JobSchedulingData']
                                 /*[local-name()='trigger' and namespace-uri()='http://quartznet.sourceforge.net/JobSchedulingData']
                                 /*[local-name()='cron' and namespace-uri()='http://quartznet.sourceforge.net/JobSchedulingData']
                                   [*[local-name() = 'name'] = 'MyTriggerName'])">

            <cron-expression  xdt:Transform="Replace">***some data***</cron-expression>
        </cron>
    </trigger>
</schedule>

see also I am trying to get the Xpath for a value but getting error for nested condition

于 2014-04-22T23:43:01.917 回答
4

将命名空间别名应用到转换文件中的石英命名空间(它可以保留为原始作业配置文件中的默认值)并在所有石英节点上使用该别名,包括在 XPath 内部。此外,您可以使用Condition而不是XPath,因此只指定与当前节点的表达式相关的 XPath 表达式部分。

<?xml version="1.0" encoding="utf-8" ?>
<q:job-scheduling-data xmlns:q="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <q:schedule>
        <q:trigger>
            <q:cron xdt:Locator="Condition(q:name='crontriggername2')" >
                <q:cron-expression xdt:Transform="Replace">***some data***</q:cron-expression>
            </q:cron>
        </q:trigger>
    </q:schedule>
</q:job-scheduling-data>
于 2014-08-01T12:37:41.703 回答
2

解决方案/更新是 --> 将命名空间添加到 XML 文档和 XPath。我需要做的就是如下修改 XML 和 XPATH。

首先更改 xml 文件添加命名空间 ( xmlns:ns0 )

<job-scheduling-data xmlns:ns0="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">

...然后编辑添加到所有节点的文件。

最后转换需要命名空间

<job-scheduling-data xmlns:ns0="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <schedule>
        <trigger>
            <cron xdt:Locator="XPath(//job-scheduling-data/schedule/trigger/cron[name='crontriggername2'])" >
                <cron-expression  xdt:Transform="Replace">***some data***</cron-expression>
            </cron>
        </trigger>
</schedule>

作为参考,这个链接帮助我理解

http://hypnocode.azurewebsites.net/?p=36

于 2014-04-22T10:55:21.143 回答
1

这是因为您的 XML 有一个默认命名空间 ( http://quartznet.sourceforge.net/JobSchedulingData)。

我对 XDT 一无所知,所以我不确定声明命名空间的简单方法,但尝试使用谷歌搜索“xdt xpath 默认命名空间”。

同时,这里有一个详细的选项,使用local-name()应该可以工作......

XPath(//*[local-name()='job-scheduling-data']/*[local-name()='schedule']/*[local-name()='trigger']/*[local-name()='cron' and *[local-name()='name']='crontriggername2'])
于 2014-03-14T20:26:09.420 回答