Я пытаюсь найти лучший (эффективный) способ сделать это.XSLT - Удалить узлы + атрибуты, соответствующие Xpath
У меня есть документ XML среднего размера. В зависимости от конкретных настроек некоторые части должны быть отфильтрованы по соображениям безопасности.
Я буду делать это в XSLT, поскольку он настраивается, и никакой код не нуждается в изменении.
Я огляделся вокруг, но не получил большой удачи.
Например:
У меня есть следующие XPath:
//*[@root='2.16.840.1.113883.3.51.1.1.6.1']
Whicrooth дает мне все узлы с корнем атрибута равным конкретному OID. В этих узлах я хочу иметь все атрибуты нескольких кроме (напр. Foo и бар) стерта, а затем с другой атрибут добавлен (напр. причина)
мне нужно иметь несколько XPath выражения, которые могут быть запущены до нуля на определенном узле и очистить его содержимое аналогичным образом в отношении узлов со специфическими атрибутами.
Я играл с информацией из:
XPath expression to select all XML child nodes except a specific list?
и Remove Elements and/or Attributes by Name per XSL Parameters
Обновит вскоре, когда я могу получить доступ, что то, что я "ве сделано до сих пор
Пример. :
XML до трансформации ОБНОВЛЕНИЕ: Я хочу, чтобы отфильтровать расширение, а затем все значения в документе, которые соответствуют значение этого атрибута расширения:
<root>
<childNode>
<innerChild root="2.16.840.1.113883.3.51.1.1.6.1" extension="123" type="innerChildness"/>
<innerChildSibling/>
</childNode>
<animals>
<cat>
<name>123</name>
</cat>
</animals>
<tree/>
<water root="2.16.840.1.113883.3.51.1.1.6.1" extension="1223" type="liquidLIke"/>
</root>
После
<root>
<childNode>
<innerChild root="2.16.840.1.113883.3.51.1.1.6.1" flavor="MSK"/> <!-- filtered -->
<innerChildSibling/>
</childNode>
<animals>
<cat>
<name>****</name>
</cat> <!-- cat was filtered -->
</animals>
<tree/>
<water root="2.16.840.1.113883.3.51.1.1.6.1" flavor="MSK"/> <!-- filtered -->
</root>
Я могу использовать XSLT2.
Я пытаюсь это без везения (для стартеров)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="OIDAttrToDelete" select="'extension'"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- Get all nodes for the OID -->
<xsl:template match="//*[@root='2.16.840.1.113883.3.51.1.1.6.1']">
<xsl:if test="name() = $OIDAttrToDelete">
<xsl:attribute name="nullFlavor">MSK</xsl:attribute>
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
В конечном итоге то, что я надеюсь, это возможность добавлять (как только я узнаю больше ... я не эксперт по XSLT) дополнительные фильтры для фильтрации XML. Это легче поддерживать, чем обновлять код каждый раз. SO каждый раз может иметь разные правила. –
Ryan Ternier: Это не слишком сложно реализовать все эти требования в преобразовании XSLT 2.0. –