Как удалить узлы из xml на основе значения тега

63
5

Используя xml и xsl, я хотел бы проанализировать входной XML-адрес для определенного узла и тега. Если значение тега начинается с "z", я хотел бы удалить этот узел. (или создать новый файл xml файла без этого узла)

Приложите образец XML файла для справки. Поскольку имя последнего имени узла начинается с "z *", я хотел бы удалить последний узел.

"Zseafood"

заранее спасибо.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ItemSet xmlns:ns1="urn:/Items/data">
<ns1:ObjectName>com</ns1:ObjectName>
<ListOfItems>
<Item>
<ns1:Name>name1</ns1:Name>
<ns1:ListOfItemDesc>
<ItemTranslation>
<ns1:DisplayName>fruits</ns1:DisplayName>
<ns1:ValidationErrorMsg>120</ns1:ValidationErrorMsg>
</ItemTranslation>
</ns1:ListOfItemDesc>
</Item>
<Item>
<ns1:Name>name2</ns1:Name>
<ns1:ListOfItemDesc>
<ItemTranslation>
<ns1:DisplayName>vegetables</ns1:DisplayName>
<ns1:ValidationErrorMsg>24.</ns1:ValidationErrorMsg>
</ItemTranslation>
</ns1:ListOfItemDesc>
</Item>
<Item>
<ns1:Name>name3</ns1:Name>
<ns1:ListOfItemDesc>
<ItemTranslation>
<ns1:DisplayName>meat</ns1:DisplayName>
<ns1:ValidationErrorMsg>12.</ns1:ValidationErrorMsg>
</ItemTranslation>
</ns1:ListOfItemDesc>
</Item>
<Item>
<ns1:Name>name4</ns1:Name>
<ns1:ListOfItemDesc>
<ItemTranslation>
<ns1:DisplayName>zseafood</ns1:DisplayName>
<ns1:ValidationErrorMsg>12.</ns1:ValidationErrorMsg>
</ItemTranslation>
</ns1:ListOfItemDesc>
</Item>
</ListOfItems>
</ItemSet>

спросил(а) 2021-01-25T20:11:00+03:00 4 месяца, 4 недели назад
1
Решение
64

Это преобразование (переопределение правила идентичности):

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

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

<xsl:template match="Item[.//ns1:DisplayName[starts-with(., 'z')]]"/>
</xsl:stylesheet>

при применении к предоставленному XML-документу:

<ItemSet xmlns:ns1="urn:/Items/data">
<ns1:ObjectName>com</ns1:ObjectName>
<ListOfItems>
<Item>
<ns1:Name>name1</ns1:Name>
<ns1:ListOfItemDesc>
<ItemTranslation>
<ns1:DisplayName>fruits</ns1:DisplayName>
<ns1:ValidationErrorMsg>120</ns1:ValidationErrorMsg>
</ItemTranslation>
</ns1:ListOfItemDesc>
</Item>
<Item>
<ns1:Name>name2</ns1:Name>
<ns1:ListOfItemDesc>
<ItemTranslation>
<ns1:DisplayName>vegetables</ns1:DisplayName>
<ns1:ValidationErrorMsg>24.</ns1:ValidationErrorMsg>
</ItemTranslation>
</ns1:ListOfItemDesc>
</Item>
<Item>
<ns1:Name>name3</ns1:Name>
<ns1:ListOfItemDesc>
<ItemTranslation>
<ns1:DisplayName>meat</ns1:DisplayName>
<ns1:ValidationErrorMsg>12.</ns1:ValidationErrorMsg>
</ItemTranslation>
</ns1:ListOfItemDesc>
</Item>
<Item>
<ns1:Name>name4</ns1:Name>
<ns1:ListOfItemDesc>
<ItemTranslation>
<ns1:DisplayName>zseafood</ns1:DisplayName>
<ns1:ValidationErrorMsg>12.</ns1:ValidationErrorMsg>
</ItemTranslation>
</ns1:ListOfItemDesc>
</Item>
</ListOfItems>
</ItemSet>

дает желаемый, правильный результат:

<ItemSet xmlns:ns1="urn:/Items/data">
<ns1:ObjectName>com</ns1:ObjectName>
<ListOfItems>
<Item>
<ns1:Name>name1</ns1:Name>
<ns1:ListOfItemDesc>
<ItemTranslation>
<ns1:DisplayName>fruits</ns1:DisplayName>
<ns1:ValidationErrorMsg>120</ns1:ValidationErrorMsg>
</ItemTranslation>
</ns1:ListOfItemDesc>
</Item>
<Item>
<ns1:Name>name2</ns1:Name>
<ns1:ListOfItemDesc>
<ItemTranslation>
<ns1:DisplayName>vegetables</ns1:DisplayName>
<ns1:ValidationErrorMsg>24.</ns1:ValidationErrorMsg>
</ItemTranslation>
</ns1:ListOfItemDesc>
</Item>
<Item>
<ns1:Name>name3</ns1:Name>
<ns1:ListOfItemDesc>
<ItemTranslation>
<ns1:DisplayName>meat</ns1:DisplayName>
<ns1:ValidationErrorMsg>12.</ns1:ValidationErrorMsg>
</ItemTranslation>
</ns1:ListOfItemDesc>
</Item>
</ListOfItems>
</ItemSet>

ответил(а) 2021-01-25T20:11:00+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема