Кажется, что вы пытаетесь создать что-то вроде правила идентификации, но вы пропускаете часть <xsl:apply-templates>
, и ваше преобразование не идет глубже.
Вот краткий ипростое решение :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<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=
"trade[not(SECURITY_TYPE = 1)
or
(not(SECURITY_SUB_TYPE = 99)
and
not(SECURITY_SUB_TYPE = 12)
)
]"/>
</xsl:stylesheet>
, когда это преобразование применяется к предоставленному документу XML (обернутым одним верхним элементом, чтобы сделать его правильно сформированным):
<t>
<trade>
<PORTFOLIO_NUMBER>123</PORTFOLIO_NUMBER>
<TICKER>F</TICKER>
<SECURITY_TYPE>1</SECURITY_TYPE>
<SECURITY_SUB_TYPE>99</SECURITY_SUB_TYPE>
<PRICE>17.98</PRICE>
<QUANTITY>1</QUANTITY>
</trade>
<trade>
<PORTFOLIO_NUMBER>123</PORTFOLIO_NUMBER>
<TICKER>C</TICKER>
<SECURITY_TYPE>1</SECURITY_TYPE>
<SECURITY_SUB_TYPE>12</SECURITY_SUB_TYPE>
<PRICE>3.42</PRICE>
<QUANTITY>1</QUANTITY>
</trade>
<trade>
<PORTFOLIO_NUMBER>123</PORTFOLIO_NUMBER>
<TICKER>AAPL</TICKER>
<SECURITY_TYPE>2</SECURITY_TYPE>
<SECURITY_SUB_TYPE>4</SECURITY_SUB_TYPE>
<PRICE>300.34</PRICE>
<QUANTITY>1</QUANTITY>
</trade>
</t>
желаемый, правильный результат получается :
<t>
<trade>
<PORTFOLIO_NUMBER>123</PORTFOLIO_NUMBER>
<TICKER>F</TICKER>
<SECURITY_TYPE>1</SECURITY_TYPE>
<SECURITY_SUB_TYPE>99</SECURITY_SUB_TYPE>
<PRICE>17.98</PRICE>
<QUANTITY>1</QUANTITY>
</trade>
<trade>
<PORTFOLIO_NUMBER>123</PORTFOLIO_NUMBER>
<TICKER>C</TICKER>
<SECURITY_TYPE>1</SECURITY_TYPE>
<SECURITY_SUB_TYPE>12</SECURITY_SUB_TYPE>
<PRICE>3.42</PRICE>
<QUANTITY>1</QUANTITY>
</trade>
</t>
Пояснение :
правило идентификации (шаблон) копирует все узлы "как есть". Использование и переопределение правила идентификации является наиболее фундаментальным шаблоном проектирования XSLT.
Существует один дополнительный шаблон, который переопределяет правило идентификации для любого элемента trade
, который не удовлетворяет требуемым свойствам выбора .Этот шаблон не имеет тела и, следовательно, приводит к тому, что преобразование вообще не обрабатывается (удаляется) любой элемент trade
, который не удовлетворяет требуемым условиям.
В результатеиз 1. и 2. выше, только trade
элементы (и их полные поддеревья), которые удовлетворяют требуемым условиям, копируются в выходные данные .