【问题标题】:SlowCheetah transform ignores multiple conditionsSlowCheetah 变换忽略多个条件
【发布时间】:2014-07-30 07:57:29
【问题描述】:

我有一个 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 端点都会从配置文件中删除,包括我希望保留的端点。我怎样才能使它正常工作?

【问题讨论】:

  • 考虑到您发布的示例,这看起来像一个错误。将endpoints 都放在一个XML 文件中,并使用表达式//endpoint[contains(@address, 'MEX') and not(contains(@binding, 'mexHttpBinding'))] 只选择较大的那个。
  • 您可以尝试另一种匹配:如果 binding 属性 always 包含精确字符串,您可以避免使用 contains() 并使用 not(@binding='mexHttpBinding')@binding != 'mexHttpBinding' .
  • 我添加了 xdtxdt-transform 标签,这应该有助于吸引使用该工具的用户。
  • @SayedIbrahimHashimi 也可以在这方面提供帮助。

标签: xsd slowcheetah xdt-transform xdt


【解决方案1】:

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

根据documentationTransform 属性RemoveAll应该“删除选定的元素或元素。”根据您发布的信息,它没有按预期工作,因为没有选择第一个元素并且无论如何都被删除了。基于this StackOverflow answer,在我看来问题出在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() 的多个单独语句来单独选择要删除的&lt;endpoint&gt; 元素,并使用xdt:Transform="Remove" 而不是RemoveAll

【讨论】:

  • 虽然我很感谢您的意见,但这三个示例都没有让我到达我需要的地方。我也试过: 得到了同样的效果,就像它忽略了服务中的条件,只是满足了端点中的条件。
  • 我明白了。我实际上无法重现您的问题。我设置了一个最小的环境,并且转换按预期工作。可能是别的东西。也许您可以自己设置一个最小的示例(足够小,您可以在此处发布完整的文件),如果您在此过程中没有发现错误,请使用更多详细信息更新您的问题。您也可以在这里发布问题:github.com/sayedihashimi/slow-cheetah/…
猜你喜欢
  • 2018-09-14
  • 2018-12-10
  • 2018-07-02
  • 1970-01-01
  • 2011-01-27
  • 2021-11-18
  • 1970-01-01
  • 2022-03-22
  • 2021-12-02
相关资源
最近更新 更多