【问题标题】:XSL template match everything except somethingXSL 模板匹配除某些东西之外的所有内容
【发布时间】:2017-11-25 09:02:29
【问题描述】:

我有一个带有 sn-p 的 xsl,如下所示:

<xsl:template match="group">
<xsl:element name="group">
<xsl:copy-of select="*"/>
</xsl:element> 
</xsl:template>

但是,我需要它来复制除类型值为“RECORD”的组之外的所有组。我该怎么做呢?我可以同时使用 XSL 1.0 和 2.0,首选 1.0。源文件包含数千个组,具有 4-5 个不同的类型值。我希望代码只选择那些没有类型值 RECORD 的组。

这是一个应该被过滤掉的示例组:

<group recstatus="1">
    <sourcedid>
      <source>system_owner_28f57240-5e2b-44af-8e62-fbf9aa6b6165</source>
      <id>basic_groups_69782a81-042d-4717-b9e4-18abacb306b7</id>
    </sourcedid>
    <grouptype>
      <scheme>Unique</scheme>
      <typevalue level="0">RECORD</typevalue>
    </grouptype>
    <description>
      <short>Ipsum dipsum</short>
    </description>
    <relationship>
      <sourcedid>
        <source>system_owner_28f57240-5e2b-44af-8e62-fbf9aa6b6165</source>
        <id>69782a81-042d-4717-b9e4-18abacb306b7</id>
      </sourcedid>
      <label>Ipsum dipsum</label>
    </relationship>
</group>

非常感谢大家的帮助!

【问题讨论】:

  • 那么对于您显示的示例输入,您想要哪个输出?
  • 最好通过选择性地应用模板来执行此过滤,而不是通过限制匹配模式。否则不匹配的group 将由默认模板处理。
  • 抱歉,如果我不清楚。源文件包含数千个组,具有 4-5 个不同的类型值。我希望代码只选择没有类型值 RECORD 的那些组。

标签: xslt xslt-1.0 xslt-2.0


【解决方案1】:

如果你使用

<xsl:template match="/*">
  <xsl:copy>
    <xsl:copy-of select="//group[not(grouptype/typevalue[level = 0] = 'RECORD')]"/>
  </xsl:copy>
</xsl:template>

你复制那些 group 元素没有那个后代 typevalueRECORD

或者,如果您想使用恒等转换模板复制所有内容,则反转条件以避免复制您要使用空模板消除的元素

<xsl:template match="group[grouptype/typevalue[level = 0] = 'RECORD']"/>

【讨论】:

  • 谢谢,这似乎可以解决问题。不幸的是,xml 文件还包含我需要保留的数千个 元素,现在这些元素也被过滤掉了。
  • 好吧,下次考虑展示一个简化但完整且最小的 XML 输入示例、您拥有的 XSLT、您想要的输出以及说明问题的输出。我已经编辑了答案以显示另一种方法,其中模板不复制您要删除的元素,它假设您还将身份转换模板作为处理其余部分的起点放在代码中。
  • 我会的,谢谢。您修改后的答案就像一个魅力。
【解决方案2】:

从字面上理解您的问题,需求的最直接 XSLT 表示是有两个模板规则:

<xsl:template match="*[everything()]" priority="10">
  ..
</xsl:template>

<xsl:template match="*[something()]" priority="20"/>

即匹配“某事”且不执行任何操作的规则,以及匹配“所有”且执行某事的较低优先级规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多