如果子节点具有特定属性,则删除父节点

卡洛伊

这与我之前的问题有关,但现在目标不同了。考虑以下xml文件:

<project>
    <UserProjAttr>G</UserProjAttr>
</project>
<mainpart>
    <proxy>
        <singlepart>
            <part>
                <coating>SP</coating>
            </part>
        </singlepart>
        <singlepart>
            <part>
                <coating>G</coating>
            </part>
        </singlepart>
        <singlepart>
            <part>
                <coating>G</coating>
            </part>
        </singlepart>
    </proxy>
</mainpart>   

单部分节点的数量是动态的;但我需要检查所有 //mainpart/proxy/singlepart/part/coating 节点值是否与 //project/UserProjAttr 值相同,如果存在差异,则可以跳过整个 mainpart 节点进行复制。

下面是我的代码,但由于我对 xslt 缺乏经验,这肯定是有问题的。

<xsl:variable name="finish" select="/project/UserProjAttr"/>
<xsl:template match="proxy">
    <xsl:choose>
    <xsl:when test="$currfinish = 'false'">
    </xsl:when>
        <xsl:otherwise>
            <xsl:copy>
                <xsl:apply-templates select="@*|node()" />
            </xsl:copy>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:variable name="currfinish" >
    <xsl:for-each select="@*|singlepart" >
        <xsl:if test="not(@*|singlepart[part/coating/@key = $finish])" >
            <xsl:value-of select="false()" />
        </xsl:if>
    </xsl:for-each>
</xsl:variable>
C队

如果您只是打算删除节点,而让其他节点保持不变,那么从身份模板开始总是好的,因为它负责复制您需要的东西。

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

这意味着您只需要一个模板来忽略mainpart所有后代coating元素是否匹配UserProjAttr或者更确切地说,如果coating没有不匹配的后代UserProjAttr

<xsl:template match="mainpart[not(proxy/singlepart/part/coating != //project/UserProjAttr)]" />

试试这个 XSLT

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

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

  <xsl:template match="mainpart[not(proxy/singlepart/part/coating != //project/UserProjAttr)]" />
</xsl:stylesheet>

请注意,如果您使用的是 XSLT 2.0,您可以在模板匹配中使用一个变量,如果您觉得它更具可读性

<xsl:variable name="finish" select="//project/UserProjAttr"/>

<xsl:template match="mainpart[not(proxy/singlepart/part/coating != $finish)]" />

而在 XSLT 3.0 中,您可以用一行替换身份模板...

<xsl:mode on-no-match="shallow-copy"/>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果子节点没有值,则删除父节点

来自分类Dev

如果子节点为空,则删除父节点

来自分类Dev

如果属性具有特定值,则删除XML节点

来自分类Dev

Firebase 数据库:如果子对象具有特定值,则检索节点

来自分类Dev

XSL计算父节点不具有具有特定属性的子节点

来自分类Dev

如果子节点元素相等,如何添加父节点?

来自分类Dev

PowerShell:如果子节点符合特定条件,则删除xml节点

来自分类Dev

如果子节点包含特定字符串,则删除XML节点

来自分类Dev

PowerShell:如果子节点符合特定条件,则删除xml节点

来自分类Dev

如果子节点等于数组值,则删除 XML 节点

来自分类Dev

Xpath选择父节点具有某些属性的节点

来自分类Dev

Xpath选择父节点具有某些属性的节点

来自分类Dev

尝试从XML中删除节点(如果该节点包含具有特定名称的子节点,但出现错误)

来自分类Dev

计算具有特定属性的节点

来自分类Dev

获取具有特定节点属性值的最新节点

来自分类Dev

如何找到具有特定值的子元素并删除其直接父节点?

来自分类Dev

如何找到具有特定值的子元素并删除其直接父节点?

来自分类Dev

根据具有特定属性的单个子元素获取父节点

来自分类Dev

如果任何子节点没有值,则删除所有父节点的内容

来自分类Dev

创建具有特定父节点值及其 XML 的所有子节点值的 Map

来自分类Dev

XSLT 组合子节点,其中父节点具有特定(未知)值

来自分类Dev

如何使用LINQ删除具有属性的重复xml节点?

来自分类Dev

TreeView删除具有相同属性的节点

来自分类Dev

UltraEdit/Notepad - XML 删除具有空属性的节点

来自分类Dev

删除xml文件中具有特定值的子节点

来自分类Dev

如果具有某些属性,请删除JSON的父对象

来自分类Dev

如果子模块可能具有公共父目录,如何从子模块中删除.git文件?

来自分类Dev

如果子模块可能具有公共父目录,如何从子模块中删除.git文件?

来自分类Dev

使用Linq选择具有特定属性的节点

Related 相关文章

  1. 1

    如果子节点没有值,则删除父节点

  2. 2

    如果子节点为空,则删除父节点

  3. 3

    如果属性具有特定值,则删除XML节点

  4. 4

    Firebase 数据库:如果子对象具有特定值,则检索节点

  5. 5

    XSL计算父节点不具有具有特定属性的子节点

  6. 6

    如果子节点元素相等,如何添加父节点?

  7. 7

    PowerShell:如果子节点符合特定条件,则删除xml节点

  8. 8

    如果子节点包含特定字符串,则删除XML节点

  9. 9

    PowerShell:如果子节点符合特定条件,则删除xml节点

  10. 10

    如果子节点等于数组值,则删除 XML 节点

  11. 11

    Xpath选择父节点具有某些属性的节点

  12. 12

    Xpath选择父节点具有某些属性的节点

  13. 13

    尝试从XML中删除节点(如果该节点包含具有特定名称的子节点,但出现错误)

  14. 14

    计算具有特定属性的节点

  15. 15

    获取具有特定节点属性值的最新节点

  16. 16

    如何找到具有特定值的子元素并删除其直接父节点?

  17. 17

    如何找到具有特定值的子元素并删除其直接父节点?

  18. 18

    根据具有特定属性的单个子元素获取父节点

  19. 19

    如果任何子节点没有值,则删除所有父节点的内容

  20. 20

    创建具有特定父节点值及其 XML 的所有子节点值的 Map

  21. 21

    XSLT 组合子节点,其中父节点具有特定(未知)值

  22. 22

    如何使用LINQ删除具有属性的重复xml节点?

  23. 23

    TreeView删除具有相同属性的节点

  24. 24

    UltraEdit/Notepad - XML 删除具有空属性的节点

  25. 25

    删除xml文件中具有特定值的子节点

  26. 26

    如果具有某些属性,请删除JSON的父对象

  27. 27

    如果子模块可能具有公共父目录,如何从子模块中删除.git文件?

  28. 28

    如果子模块可能具有公共父目录,如何从子模块中删除.git文件?

  29. 29

    使用Linq选择具有特定属性的节点

热门标签

归档