您好我正在尝试使用VS2012 XDT替换<cron-expression>
,方法是在quartz.net作业描述文件中使用以下转换。我已经使用在线测试仪测试了XPath定位器,它返回了我认为我需要的东西&#39;。任何帮助表示赞赏。
<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 =&#39; crontriggername2&#39;]
返回正确的元素组(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 config transform)
任何人都能指出我一个正确的解决方案,这让我感到疯狂。提前谢谢。
答案 0 :(得分:4)
不需要对原始文件进行任何修改的替代解决方案是
<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>
另见I am trying to get the Xpath for a value but getting error for nested condition
答案 1 :(得分:3)
将名称空间别名应用于转换文件中的quartz命名空间(它可以保留为原始作业配置文件中的默认名称),并在所有石英节点上使用该别名,包括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>
答案 2 :(得分:1)
这是因为您的XML具有默认命名空间(http://quartznet.sourceforge.net/JobSchedulingData
)。
我对XDT一无所知,所以我不确定声明命名空间的简单方法,但是尝试使用Google搜索&#34; xdt xpath默认命名空间&#34;。
同时,这里使用{em> 工作的local-name()
的详细选项...
XPath(//*[local-name()='job-scheduling-data']/*[local-name()='schedule']/*[local-name()='trigger']/*[local-name()='cron' and *[local-name()='name']='crontriggername2'])
答案 3 :(得分:1)
解决方案/更新是 - &gt;将名称空间添加到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>
作为参考,此链接帮助我理解
答案 4 :(得分:0)
您的转换XML需要具有与源XML相同的默认命名空间(xmlns
属性)。此外,您不应该需要xdt:Locator属性。
它应该是这样的:
<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<schedule>
<trigger>
<cron>
<cron-expression xdt:Transform="Replace">***some data***</cron-expression>
</cron>
</trigger>
</schedule>
</job-scheduling-data>