Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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 1.0 XSLT删除不在列表中的节点,同时保留列表中的所有子节点_Xslt 1.0 - Fatal编程技术网

Xslt 1.0 XSLT删除不在列表中的节点,同时保留列表中的所有子节点

Xslt 1.0 XSLT删除不在列表中的节点,同时保留列表中的所有子节点,xslt-1.0,Xslt 1.0,我有一个ID列表,我想用它来“过滤”提供的xml文件。应保留列表中的每个节点,删除列表中未包含的每个节点 对我来说,困难在于当我删除一个节点(不在IDList中)时,我也会删除可能在IDList中的子节点 最后,我需要保持节点的嵌套(参见下面的示例) 这是我的ID列表: 怠速=2,3,5,6 这是我的输入xml是: 埃尔姆伍德协会 奥克伍德协会 奥克伍德分会A 奥克伍德分会 奥克伍德分会B 雪松木协会 这是我想要的输出: 奥克伍德协会 奥克伍德分会 奥克伍德分会B 雪松木协会 任何帮助都

我有一个ID列表,我想用它来“过滤”提供的xml文件。应保留列表中的每个节点,删除列表中未包含的每个节点

对我来说,困难在于当我删除一个节点(不在IDList中)时,我也会删除可能在IDList中的子节点

最后,我需要保持节点的嵌套(参见下面的示例)

这是我的ID列表:

怠速=2,3,5,6

这是我的输入xml是:


埃尔姆伍德协会
奥克伍德协会
奥克伍德分会A
奥克伍德分会
奥克伍德分会B
雪松木协会
这是我想要的输出:


奥克伍德协会
奥克伍德分会
奥克伍德分会B
雪松木协会

任何帮助都将不胜感激

I.XSLT2.0解决方案:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pIds" select="2, 3, 5, 6" as="xs:integer+"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template priority="2" match=
  "Association[not(@ASSOCIATION_ID = $pIds)
             and not(.//Association[@ASSOCIATION_ID = $pIds])]"/>

 <xsl:template match=
  "Association[@ASSOCIATION_ID = $pIds]
        //Association[not(@ASSOCIATION_ID = $pIds)]
  |
   *[not(self::Association[@ASSOCIATION_ID = $pIds])]
      /node()[not(descendant-or-self::Association[@ASSOCIATION_ID = $pIds])]
  ">
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>
<Associations>
    <Association ASSOCIATION_ID="1">
        Elmwood Association
        <Homes/>
    </Association>
    <Association ASSOCIATION_ID="2">
        Oakwood Association
        <Homes/>
        <Association ASSOCIATION_ID="4">
            Oakwood Sub Association A
            <Homes/>
            <Association ASSOCIATION_ID="6">
                Oakwood Sub Sub Association
                <Homes/>
            </Association>
        </Association>
        <Association ASSOCIATION_ID="5">
            Oakwood Sub Association B
            <Homes/>
        </Association>
    </Association>
    <Association ASSOCIATION_ID="3">
        Cedarwood Association
        <Homes/>
    </Association>
</Associations>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <my:ids>
   <id>2</id>
   <id>3</id>
   <id>5</id>
   <id>6</id>
 </my:ids>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template priority="2" match=
  "Association[not(@ASSOCIATION_ID = document('')/*/my:ids/*)
             and not(.//Association[@ASSOCIATION_ID = document('')/*/my:ids/*])]"/>

 <xsl:template match=
  "Association[@ASSOCIATION_ID = document('')/*/my:ids/*]
        //Association[not(@ASSOCIATION_ID = document('')/*/my:ids/*)]
  |
   *[not(self::Association[@ASSOCIATION_ID = document('')/*/my:ids/*])]
      /node()[not(descendant-or-self::Association
                         [@ASSOCIATION_ID = document('')/*/my:ids/*])]
  ">
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pIds" select="2, 3, 5, 6" as="xs:integer+"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template priority="2" match=
  "Association[not(@ASSOCIATION_ID = $pIds)
             and not(.//Association[@ASSOCIATION_ID = $pIds])]"/>

 <xsl:template match=
  "Association[@ASSOCIATION_ID = $pIds]
        //Association[not(@ASSOCIATION_ID = $pIds)]
  |
   *[not(self::Association[@ASSOCIATION_ID = $pIds])]
      /node()[not(descendant-or-self::Association[@ASSOCIATION_ID = $pIds])]
  ">
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>
<Associations>
    <Association ASSOCIATION_ID="1">
        Elmwood Association
        <Homes/>
    </Association>
    <Association ASSOCIATION_ID="2">
        Oakwood Association
        <Homes/>
        <Association ASSOCIATION_ID="4">
            Oakwood Sub Association A
            <Homes/>
            <Association ASSOCIATION_ID="6">
                Oakwood Sub Sub Association
                <Homes/>
            </Association>
        </Association>
        <Association ASSOCIATION_ID="5">
            Oakwood Sub Association B
            <Homes/>
        </Association>
    </Association>
    <Association ASSOCIATION_ID="3">
        Cedarwood Association
        <Homes/>
    </Association>
</Associations>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <my:ids>
   <id>2</id>
   <id>3</id>
   <id>5</id>
   <id>6</id>
 </my:ids>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template priority="2" match=
  "Association[not(@ASSOCIATION_ID = document('')/*/my:ids/*)
             and not(.//Association[@ASSOCIATION_ID = document('')/*/my:ids/*])]"/>

 <xsl:template match=
  "Association[@ASSOCIATION_ID = document('')/*/my:ids/*]
        //Association[not(@ASSOCIATION_ID = document('')/*/my:ids/*)]
  |
   *[not(self::Association[@ASSOCIATION_ID = document('')/*/my:ids/*])]
      /node()[not(descendant-or-self::Association
                         [@ASSOCIATION_ID = document('')/*/my:ids/*])]
  ">
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>

埃尔姆伍德协会
奥克伍德协会
奥克伍德分会A
奥克伍德分会
奥克伍德分会B
雪松木协会
生成所需的正确结果

<Associations>
   <Association ASSOCIATION_ID="2">
        Oakwood Association
        <Homes/>
      <Association ASSOCIATION_ID="6">
                Oakwood Sub Sub Association
                <Homes/>
      </Association>
      <Association ASSOCIATION_ID="5">
            Oakwood Sub Association B
            <Homes/>
      </Association>
   </Association>
   <Association ASSOCIATION_ID="3">
        Cedarwood Association
        <Homes/>
   </Association>
</Associations>

奥克伍德协会
奥克伍德分会
奥克伍德分会B
雪松木协会

II。XSLT 1.0解决方案:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pIds" select="2, 3, 5, 6" as="xs:integer+"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template priority="2" match=
  "Association[not(@ASSOCIATION_ID = $pIds)
             and not(.//Association[@ASSOCIATION_ID = $pIds])]"/>

 <xsl:template match=
  "Association[@ASSOCIATION_ID = $pIds]
        //Association[not(@ASSOCIATION_ID = $pIds)]
  |
   *[not(self::Association[@ASSOCIATION_ID = $pIds])]
      /node()[not(descendant-or-self::Association[@ASSOCIATION_ID = $pIds])]
  ">
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>
<Associations>
    <Association ASSOCIATION_ID="1">
        Elmwood Association
        <Homes/>
    </Association>
    <Association ASSOCIATION_ID="2">
        Oakwood Association
        <Homes/>
        <Association ASSOCIATION_ID="4">
            Oakwood Sub Association A
            <Homes/>
            <Association ASSOCIATION_ID="6">
                Oakwood Sub Sub Association
                <Homes/>
            </Association>
        </Association>
        <Association ASSOCIATION_ID="5">
            Oakwood Sub Association B
            <Homes/>
        </Association>
    </Association>
    <Association ASSOCIATION_ID="3">
        Cedarwood Association
        <Homes/>
    </Association>
</Associations>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <my:ids>
   <id>2</id>
   <id>3</id>
   <id>5</id>
   <id>6</id>
 </my:ids>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template priority="2" match=
  "Association[not(@ASSOCIATION_ID = document('')/*/my:ids/*)
             and not(.//Association[@ASSOCIATION_ID = document('')/*/my:ids/*])]"/>

 <xsl:template match=
  "Association[@ASSOCIATION_ID = document('')/*/my:ids/*]
        //Association[not(@ASSOCIATION_ID = document('')/*/my:ids/*)]
  |
   *[not(self::Association[@ASSOCIATION_ID = document('')/*/my:ids/*])]
      /node()[not(descendant-or-self::Association
                         [@ASSOCIATION_ID = document('')/*/my:ids/*])]
  ">
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>

2.
3.
5.
6.

Dimitre,我没有正确指定xslt-2.0,所以xslt-1.0是唯一可用的选项(对不起!)。当我尝试你的代码时,我只得到了association_Id=2节点的关联。这是因为我在xslt-1.0中吗?@user2340911,如果您的xslt 1.0处理器是真正兼容的并且没有错误,那么您应该收到编译时错误消息,或者至少是警告。至于将其转换为XSLT1.0,这是可能的,但看起来更笨拙。我现在就要开始工作了--大约10小时后,我将能够看到XSLT1.0解决方案。@Schletz,我根据要求在回答中添加了一个XSLT1.0解决方案。