У меня есть файл xml, мне нужно обновить файл xml на основе выбора определенного узла и удаления из него определенных атрибутов.
В файле xml мне нужно выбрать узел, чье имя сценария проверки = «тест ABC», затем мне нужно удалить проверку, имя которой abc_name равно «data_005» и «data_006» только из ABC_test (не из теста XYZ)
Введите xml:
<?xml version = "1.0" encoding = "UTF-8"?>
<config xmlns = "http://abcxyz.com/abc/config" version = "0.37">
<validationscenarios>
<validationscenarioslist>
<validationscenario>
<name>ABC test</name>
<validations>
<validation abc_name = "data_001" levels = "1"/>
<validation abc_name = "data_002" levels = "2.4"/>
<validation abc_name = "data_003" levels = "6.0"/>
<validation abc_name = "data_004" levels = "4.0"/>
<validation abc_name = "data_005" levels = "2,3"/>
<validation abc_name = "data_006" levels = "3.5,4.5"/>
</validations>
</validationscenario>
<validationscenario>
<name>XYZ test</name>
<validations>
<validation abc_name = "data_001" levels = "3.5"/>
<validation abc_name = "data_002" levels = "5.5"/>
<validation abc_name = "data_005" levels = "6.5"/>
<validation abc_name = "data_006" levels = "4.5"/>
</validations>
</validationscenario>
</validationscenarioslist>
</validationscenarios>
</config>
Я попытался написать сценарий и дошел до середины, я могу выбрать узел, но не могу удалить атрибут.
мой xslt (неполный) скрипт
<xsl:transform xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" xmlns:cc = "http://abcxyz.com/abc/config" xmlns = "http://abcxyz.com/abc/config" version = "1.0">
<xsl:output method = "xml" encoding = "utf-8" indent = "yes" omit-xml-declaration = "no" standalone = "no"/>
<xsl:strip-space elements = "*"/>
<xsl:template match = "@*|node()|comment()">
<xsl:copy>
<xsl:apply-templates select = "@*|node()|comment()"/>
</xsl:copy>
</xsl:template>
<xsl:template match = " /cc:config/cc:validationscenarios/cc:validationscenarioslist/cc:validationscenario/cc:name[contains(.,'ABC test')]">
// not working here //cc:validations/cc:validation[@abc_name='data_005'] //
</xsl:transform>
Я хочу удалить проверку, чей abc_name = "data_006"
AFAICT, вы хотите сделать:
XSLT 3.0.
<xsl:stylesheet version = "3.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace = "http://abcxyz.com/abc/config">
<xsl:output method = "xml" version = "1.0" encoding = "UTF-8" indent = "yes"/>
<xsl:mode on-no-match = "shallow-copy"/>
<xsl:template match = "validationscenario[name='ABC test']/validations/validation[@abc_name=('data_005', 'data_006')]"/>
</xsl:stylesheet>
Я использую только версию 1.0, в которой я получаю следующую ошибку «режим элемента строки 6 xsltParseStylesheetTop: неизвестный элемент режима»
Если вы ограничены XSLT 1.0, не тратьте время всех, отмечая свой вопрос как xslt-2.0
и xslt-3.0
.
вместо:
<xsl:template match = " /cc:config/cc:validationscenarios/cc:validationscenarioslist/cc:validationscenario/cc:name[contains(.,'ABC test')]">
использовать:
<xsl:template match = "cc:validationscenario[name='ABC test']/cc:validations/cc:validation[@abc_name[.='data_005' or .= 'data_006']]"/>
<xsl:template match = "/cc:config/cc:validationscenarios/cc:validationscenarioslist/cc:validationscenario[cc:name='abc_test']/cc:validationthresholds/cc:validationthreshold [@abc_name[.='test_05' или .= 'test_06']]"/> Я могу извлечь нужное значение после небольшой модификации.
Пожалуйста, отредактируйте свой вопрос и добавьте ожидаемый результат.