Я совершенно заблудился, пытаясь подобрать XLST для одноразового проекта (анализ загруженной информации о схеме Salesforce для взаимосвязей между таблицами на проприетарном языке сценариев, который в основном просто дает мне XPATH, XSLT и циклы while -- и я никогда не слышал о XSLT до сегодняшнего дня ... он выглядит многообещающе для второй половины моих потребностей в фильтрах) .
У меня есть входной XML, который выглядит следующим образом:
<result>
<custom>True</custom>
<createable>False</createable>
<fields>
<createdBy>Joe</createdBy>
<name>field1</name>
<referenceTo>otherPlaceXYZ</referenceTo>
<type>reference</type>
</fields>
<fields>
<createdBy>Joe</createdBy>
<name>field2</name>
</fields>
<fields>
<createdBy>Joe</createdBy>
<name>field3</name>
<referenceTo>otherPlaceABC</referenceTo>
<type>reference</type>
</fields>
<name>CoolName</name>
<label>A label</label>
<searchable>False</searchable>
</result>
Я хочу сделать 2 типа фильтров:
- Выбрасывать любые
<fields>...</fields>
узлы, у которых нет <type>reference</type>
подузла - В данных, которыеостается, выбрасывая детей
<result>...</result>
, которые не <fields>...</fields>
, <name>...</name>
или <label>...</label>
, а также выбрасывая детей <fields>...</fields>
, которые не <name>...</name>
или <referenceTo>...</referenceTo>
(хотя я не был бы против оставить в <type>...</type>
, если это делает код проще) .Обратите внимание, что на самом деле у меня есть 5 или 6 полей, которые я хочу сохранить в «полях» (из десятков в файле), но в этом примере это коротко и привлекательно.Аналогично, есть десятки детей с «результатом», которые меня не волнуют.
Я бы хотел, чтобы мои выходные данные выглядели так:
<result>
<fields>
<name>field1</name>
<referenceTo>otherPlaceXYZ</referenceTo>
</fields>
<fields>
<name>field3</name>
<referenceTo>otherPlaceABC</referenceTo>
</fields>
<name>CoolName</name>
<label>A label</label>
</result>
Я играл на http://www.utilities -online.info / xsltransformation / , но застрял.Документация по XSLT, по-видимому, в основном ориентирована на выполнение гораздо более сложных преобразований данных, чем «тот же XML-файл, только меньшего размера», поэтому я изо всех сил пытаюсь найти самый простой способ выполнить эту работу.
Есть какие-нибудь указатели?
Я дошел до этого благодаря удалению родительского узла, если дочерний узел отсутствует в xml, с использованием xslt , но я не уверен, что даже лаюдерево, учитывая мое последнее желание на выходе.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<!--Identity template to copy all content by default-->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="fields[not(type='reference')]"/>
</xsl:stylesheet>