Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt XSL模板匹配除某些内容之外的所有内容_Xslt_Xslt 1.0_Xslt 2.0 - Fatal编程技术网

Xslt XSL模板匹配除某些内容之外的所有内容

Xslt XSL模板匹配除某些内容之外的所有内容,xslt,xslt-1.0,xslt-2.0,Xslt,Xslt 1.0,Xslt 2.0,我有一个xsl,其中有一个片段,如下所示: <xsl:template match="group"> <xsl:element name="group"> <xsl:copy-of select="*"/> </xsl:element> </xsl:template> 但是,我需要它来复制所有组,除了那些带有typevalue记录的组。我该怎么做?我可以同时使用XSL1.0和2.0,首选1.0。源文件包含数千个组,具有4-5个不同的

我有一个xsl,其中有一个片段,如下所示:

<xsl:template match="group">
<xsl:element name="group">
<xsl:copy-of select="*"/>
</xsl:element> 
</xsl:template>
但是,我需要它来复制所有组,除了那些带有typevalue记录的组。我该怎么做?我可以同时使用XSL1.0和2.0,首选1.0。源文件包含数千个组,具有4-5个不同的TypeValue。我希望代码只选择那些没有typevalue记录的组

下面是一个应过滤掉的示例组:

<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>
非常感谢您的帮助

如果您使用

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

从字面上看,需求最直接的XSLT表示形式是有两个模板规则:

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

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

也就是说,一个匹配某事物但不执行任何操作的规则,以及一个匹配所有事物但执行某些操作的低优先级规则。

那么,对于您所显示的示例输入,您希望哪种输出?最好通过有选择地应用模板来进行过滤,而不是通过限制匹配模式。否则,不匹配的组将由默认模板处理。如果我不清楚,请道歉。源文件包含数千个组,具有4-5个不同的TypeValue。我希望代码只选择那些没有typevalue记录的组。谢谢你,这似乎可以做到。不幸的是,XML文件也包含了几千个我需要保留的元素,这些元素现在也被过滤掉了。好的,下一次考虑显示一个减少但完成的和最小的XML输入示例,XSLT你有,你想要的输出,以及你要说明的问题。我对答案进行了编辑,以显示另一种方法,该方法的模板不复制要删除的元素,它假定您也将身份转换模板作为处理其余内容的起点。我会的,谢谢。你修改后的答案很有魅力。
<xsl:template match="*[everything()]" priority="10">
  ..
</xsl:template>

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