SlowCheetah变换忽略了多个条件

时间:2014-06-09 17:57:45

标签: xsd slowcheetah xdt-transform xdt

我有一个WCF配置文件,我试图使用SlowCheetah进行转换。对于开发用途,我们希望包含MEX端点,但是当我们发布产品时,应该删除除一个端点之外的所有服务的端点。应该留给它的服务器有以下端点:

<endpoint address="MEX" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange" />

应删除的内容如下:

    <endpoint address="net.tcp://computername:8001/WCFAttachmentService/MEX"
                        binding="netTcpBinding"
                        bindingConfiguration="UnsecureNetTcpBinding"
                        name="WCFAttachmentServiceMexEndpoint"
                        contract="IMetadataExchange" />

我正在使用的转换是:

<service>
    <endpoint xdt:Locator="Condition(contains(@address, 'MEX') and not(contains(@binding, 'mexHttpBinding')))" xdt:Transform="RemoveAll" />
</service>

但是,当我运行此命令时,将从配置文件中删除所有MEX端点,包括我希望保留的端口。我该如何正常工作?

1 个答案:

答案 0 :(得分:0)

选择节点的Locator 条件表达式似乎是正确的。如果您只有在示例中发布的两个端点,则此表达式将选择第二个端点。

根据documentation Transform属性RemoveAll 应该&#34;删除所选元素。& #34;根据您发布的信息,它没有按预期工作,因为第一个元素未被选中并且无论如何都被删除了。根据{{​​3}},在我看来,问题出在Condition上。我不确定这是否是一个错误(它记录不完整),但你可以尝试一些替代解决方案:

1)使用XPath代替Condition。由于Condition表达式而应用于配置文件的有效XPath表达式为:

/services/service/endpoint[contains(@address, 'MEX') and not(contains(@binding, 'mexHttpBinding'))]

您还应使用XPath属性而不是Condition获取相同的结果

<endpoint xdt:Locator="XPath(/services/service/endpoint[contains(@address, 'MEX') 
                             and not(contains(@binding, 'mexHttpBinding'))])" xdt:Transform="RemoveAll" />

2)使用Match并测试binding等属性。这是一个更简单的测试,IMO是执行匹配的首选方式。您可以通过binding属性

选择要删除的节点
<endpoint binding="netTcpBinding" xdt:Locator="Match(binding)" xdt:Transform="RemoveAll" />

3)如果您有许多不同的绑定,并且只想删除那些 XPath的那些,请使用Match代替mexHttpBinding

<endpoint xdt:Locator="XPath(/services/service/endpoint[not(@binding='mexHttpBinding'))" xdt:Transform="RemoveAll" />

4)最后,您可以尝试使用Condition()Match()的多个单独语句分别选择要删除的<endpoint>元素,并使用xdt:Transform="Remove"代替RemoveAll