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
Xml XSL选择所有节点,其中不是另一个节点的节点_Xml_Xslt_Xpath - Fatal编程技术网

Xml XSL选择所有节点,其中不是另一个节点的节点

Xml XSL选择所有节点,其中不是另一个节点的节点,xml,xslt,xpath,Xml,Xslt,Xpath,这是我的xml <element1> <subel1/> </element1> <element2> <subel2/> </element2> <element3> <subel3/> </element3> <criteria> <subel3/> </criteria> 如何使用xsl选择所有不在条件子节点中的节点? 像这样 <su

这是我的xml

<element1> <subel1/> </element1> <element2> <subel2/> </element2> <element3> <subel3/> </element3> <criteria> <subel3/> </criteria>

如何使用xsl选择所有不在条件子节点中的节点? 像这样

 <subel1/> <subel2/>

这是怎么做到的

如果xml格式为:

<element1> 
<el> subel1 </el>
</element1>
 <element2> 
<el> subel2 
</el> 
</element2> 
<element3> 
<el> subel3 </el> 
</element3> 
<criteria> 
<subel3/> 
</criteria>

subel1
subel2
subel3

您是否缺少XML代码?如果您输入代码并在编辑器中将其标记为sourcecode(带有“101 010”的按钮),会更容易提供帮助。

您是否缺少xmlcode?如果您输入代码并在编辑器中将其标记为sourcecode(带有“101 010”的按钮),则会更容易提供帮助。

最简单的方法是构造一个xpath表达式,该表达式将对照条件节点进行交叉检查。例如:

步骤1:以下步骤将选择不在“条件”区域中的所有节点(因此,所有没有名为“条件”的父节点的节点)

步骤2:过滤掉也出现在critera部分的所有节点

//*[name(..) != 'criteria' and not(name(//criteria/*) = name(.))]
现在,最后一条语句将选择与条件节点不匹配的所有节点。但是您只需要子节点,因此我们可以修改选择器,只获取“子元素”元素或没有子节点的叶元素

//*[name(..) != 'criteria' and not(name(//criteria/*) = name(.)) and not(*)]
下面是我们每一个条件的细目:

姓名(…)!='criteria'--对不在criteria部分中的节点的限制

not(name(//criteria/*)=name(.)--对与条件部分中的节点名称不同的节点的限制

and not(*)-对没有任何子节点的节点进行限制(因此可以选择所需的叶节点。)

因此,如果你要做一些类似的事情:

<xsl:for-each select="//*[name(..) != 'criteria' and not(name(//criteria/*) = name(.)) and not(*)]">
 <xsl:value-of select="name(current())"/> :
</xsl:for-each>
希望这有帮助

干杯


Casey

实现这一点的最简单方法是构造一个xpath表达式,该表达式根据条件节点进行交叉检查。例如:

步骤1:以下步骤将选择不在“条件”区域中的所有节点(因此,所有没有名为“条件”的父节点的节点)

步骤2:过滤掉也出现在critera部分的所有节点

//*[name(..) != 'criteria' and not(name(//criteria/*) = name(.))]
现在,最后一条语句将选择与条件节点不匹配的所有节点。但是您只需要子节点,因此我们可以修改选择器,只获取“子元素”元素或没有子节点的叶元素

//*[name(..) != 'criteria' and not(name(//criteria/*) = name(.)) and not(*)]
下面是我们每一个条件的细目:

姓名(…)!='criteria'--对不在criteria部分中的节点的限制

not(name(//criteria/*)=name(.)--对与条件部分中的节点名称不同的节点的限制

and not(*)-对没有任何子节点的节点进行限制(因此可以选择所需的叶节点。)

因此,如果你要做一些类似的事情:

<xsl:for-each select="//*[name(..) != 'criteria' and not(name(//criteria/*) = name(.)) and not(*)]">
 <xsl:value-of select="name(current())"/> :
</xsl:for-each>
希望这有帮助

干杯


凯西

这一转变

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:for-each select=
  "/*/*[not(self::criteria)]/*">
   <xsl:copy-of select=
   "self::node()[not(/*/criteria/*[name()=name(current())])]"/>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>
产生想要的结果(在撰写本文时,没有其他已发布的答案产生正确的结果):


逐步解释

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:for-each select=
  "/*/*[not(self::criteria)]/*">
   <xsl:copy-of select=
   "self::node()[not(/*/criteria/*[name()=name(current())])]"/>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>
  • XPath表达式:

    /*/*[非(自身::标准)]/*

  • 选择其父元素不是命名为
    “criteria”
    的元素且是文档顶部元素的子元素的每个元素

  • 指令中,我们检查当前节点的名称是否不是
    条件的任何子节点的名称之一,并且只复制这样一个节点:
  • self::node()

    此XPath表达式仅当不存在与当前节点名称相同的
    /*/criteria
    的子节点时才选择当前节点(
    self::node()
    ),而该子节点的名称与当前节点的名称相同(
    不是(/*/criteria/*[name()=name(current()))


    这里我们使用这样一个事实,即
    not(someNode Set)
    只有在nodeset
    someNode Set
    为空时才是
    false()

    此转换:

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:template match="/">
      <xsl:for-each select=
      "/*/*[not(self::criteria)]/*">
       <xsl:copy-of select=
       "self::node()[not(/*/criteria/*[name()=name(current())])]"/>
      </xsl:for-each>
     </xsl:template>
    </xsl:stylesheet>
    
    产生想要的结果(在撰写本文时,没有其他已发布的答案产生正确的结果):

    
    
    逐步解释

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:template match="/">
      <xsl:for-each select=
      "/*/*[not(self::criteria)]/*">
       <xsl:copy-of select=
       "self::node()[not(/*/criteria/*[name()=name(current())])]"/>
      </xsl:for-each>
     </xsl:template>
    </xsl:stylesheet>
    
  • XPath表达式:

    /*/*[非(自身::标准)]/*

  • 选择其父元素不是命名为
    “criteria”
    的元素且是文档顶部元素的子元素的每个元素

  • 指令中,我们检查当前节点的名称是否不是
    条件的任何子节点的名称之一,并且只复制这样一个节点:
  • self::node()

    此XPath表达式仅当不存在与当前节点名称相同的
    /*/criteria
    的子节点时才选择当前节点(
    self::node()
    ),而该子节点的名称与当前节点的名称相同(
    不是(/*/criteria/*[name()=name(current()))


    这里我们使用这样一个事实,即
    not(someNode Set)
    只有在nodeset
    someNode Set
    为空时才是
    false()

    好问题(+1)。请参阅我的答案,以获得完整且唯一正确的解决方案。好问题(+1)。请参阅我的答案,以获取完整且唯一正确的解决方案。此解决方案应用于我的答案中的XML文档时,会生成两个元素名称,但正确的结果只有一个元素名称。事实上,我的解决方案不适用于您提供的XML。但是,这与他提供的xml不同。我的解决方案确实适用于他的xml。也就是说,您的解决方案更加健壮。这就是我为什么要得分的原因!这个解决方案应用于我的答案中的XML文档时会产生两个元素名,但正确的结果只有一个元素名。但是,这与他提供的xml不同。我的解决方案确实适用于他的xml。也就是说,您的解决方案更加健壮。这就是我为什么要得分的原因!