Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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

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节点/元素_Xml_Xslt - Fatal编程技术网

从同一级别的另一个元素中按值删除XML节点/元素

从同一级别的另一个元素中按值删除XML节点/元素,xml,xslt,Xml,Xslt,正如我在线程标题中已经提到的,我想删除一个节点或元素,这取决于同一级别中另一个元素的值 为了防止重复标记,问题不在于从xml中删除元素或节点,而在于从同一子节点/级别的另一个元素中删除与值相关的节点或元素。 为了说明这一点,我用随机样本数据构建了一个示例结构 <ROOT> <DETAILS> <ALLOC> <TYPE>NEEDED</TYPE> <VALUE

正如我在线程标题中已经提到的,我想删除一个节点或元素,这取决于同一级别中另一个元素的值

为了防止重复标记,问题不在于从xml中删除元素或节点,而在于从同一子节点/级别的另一个元素中删除与值相关的节点或元素。

为了说明这一点,我用随机样本数据构建了一个示例结构

<ROOT>
    <DETAILS>
        <ALLOC>
            <TYPE>NEEDED</TYPE>
            <VALUE>do not remove</VALUE>
            <NAME>also requiered</NAME>
        </ALLOC>
    </DETAILS>
    <DETAILS>
        <ALLOC>
            <TYPE>UNNEEDED</TYPE>
            <VALUE>remove this</VALUE>
            <NAME> but this requiered</NAME>
        </ALLOC>
    </DETAILS>
    <DETAILS>
        <ALLOC>
            <TYPE>NEEDED</TYPE>
            <VALUE>do not remove</VALUE>
            <NAME>also requiered</NAME>
        </ALLOC>
    </DETAILS>
    <SOMEWHERE>
        <OTHERWHERE>
            <TYPE>UNNEEDED</TYPE>
            <VALUE>but do not remove</VALUE>
            <NAME>also requiered</NAME>
        </OTHERWHERE>
    </SOMEWHERE>
</ROOT>

需要
不要移除
也要求
多余的
去掉这个
但这要求
需要
不要移除
也要求
多余的
但不要移除
也要求
现在,如果同一节点中类型的文本值“不需要”,我需要一个xsl转换来删除节点值

此转换的inpur参数如下所示 if:/ROOT/DETAILS/ALLOC/TYPE=不需要 然后删除:/ROOT/DETAILS/ALLOC/VALUE

可能是定义了多个删除,所以我必须删除一个或多个元素

if:/ROOT/DETAILS/ALLOC/TYPE=不需要 然后删除:/ROOT/DETAILS/ALLOC/VALUE/ROOT/DETAILS/ALLOC/otherElement

+搜索字符串“UNNEEDED”是示例性的,可以是任何内容(名称、描述、标识符)

要通过简单的xpath表达式删除节点,请在所有节点上删除节点值。按索引删除节点这是不可能的。我必须动态转换xml结构。结构可以包含此值,但不必包含

所以期望的输出是

<ROOT>
    <DETAILS>
        <ALLOC>
            <TYPE>NEEDED</TYPE>
            <VALUE>do not remove</VALUE>
            <NAME>also requiered</NAME>
        </ALLOC>
    </DETAILS>
    <DETAILS>
        <ALLOC>
            <TYPE>UNNEEDED</TYPE>
            - - - - - - - - - - -
            <NAME> but this requiered</NAME>
        </ALLOC>
    </DETAILS>
    <DETAILS>
        <ALLOC>
            <TYPE>NEEDED</TYPE>
            <VALUE>do not remove</VALUE>
            <NAME>also requiered</NAME>
        </ALLOC>
    </DETAILS>
    <SOMEWHERE>
        <OTHERWHERE>
            <TYPE>UNNEEDED</TYPE>
            <VALUE>but do not remove</VALUE>
            <NAME>also requiered</NAME>
        </OTHERWHERE>
    </SOMEWHERE>
</ROOT>

需要
不要移除
也要求
多余的
- - - - - - - - - - -
但这要求
需要
不要移除
也要求
多余的
但不要移除
也要求
[只有XPATH:/ROOT/DETAILS/ALLOC中的元素'Value'必须删除,但XPATH/ROOT/某处/OTHERWHERE中的元素'Value'不能删除]

通过无索引xpath表达式删除节点,删除此xpath上所有子节点的节点值 通过索引xpath表达式删除节点也是不可能的,因为我以前不知道索引。给定的xpath表达式是无索引的,我必须检查类型的文本值是否为'something',然后删除节点'value'

我只能通过xml和xslt来解决这个问题

我想提前向您表示感谢。

请尝试以下方式:

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="VALUE[../TYPE='UNNEEDED']"/>

</xsl:stylesheet>
试着这样做:

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="VALUE[../TYPE='UNNEEDED']"/>

</xsl:stylesheet>

谢谢你的主意,迈克尔。霍尔257K。我也试过这种方法。它会起作用,但问题是元素的相对路径。可能是相对路径可以在其他地方找到,并且也会修改此节点。@Hans.Olo,您的评论有点不清楚。可能是一个有帮助的示例。@Hans.Olo如果它有一个值为
“不需要的”
的同级
类型
,这将删除
值。如果你说“在同一水平”是指其他东西,你需要澄清。早上好,伙计们,我已经编辑了这个问题,并试图更好地解释它。我希望它现在更容易理解。我可以用你的方法解决这个问题,它相对简单。我觉得已经太复杂了。谢谢你的主意,迈克尔。霍尔257K。我也试过这种方法。它会起作用,但问题是元素的相对路径。可能是相对路径可以在其他地方找到,并且也会修改此节点。@Hans.Olo,您的评论有点不清楚。可能是一个有帮助的示例。@Hans.Olo如果它有一个值为
“不需要的”
的同级
类型
,这将删除
值。如果你说“在同一水平”是指其他东西,你需要澄清。早上好,伙计们,我已经编辑了这个问题,并试图更好地解释它。我希望它现在更容易理解。我可以用你的方法解决这个问题,它相对简单。我觉得已经太复杂了。