У меня есть XML-файл с множеством узлов, каждый из которых имеет огромное количество атрибутов.Для простоты предположим, что XML выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<header />
<group>
<node1 attr1="x" attr2="y" attr3="z" />
<node2 attr4="x" attr5="y" attr6="z" />
<node3 attr7="x" attr8="y" attr9="z" />
<node1 attr1="x" attr2="y" attr3="z" />
</group>
</root>
Я хотел бы сократить этот XML до уменьшенной версии, сократив содержимое /root/group/
, исключив как атрибуты, так и узлы.
- все узлы с именем
node3
должны быть удалены - Узлы с именем
node1
должны иметь только атрибут attr1
- Узлы с именем
node2
должен иметь только атрибуты attr5
и attr6
Я мог бы написать для этого простой XSLT, используя простой if-match-do-nothing , например.
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="/root/group/node3" />
<xsl:template match="/root/group/node1/@attr2" />
<xsl:template match="/root/group/node1/@attr3" />
<xsl:template match="/root/group/node2/@attr4" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Это, однако, не соответствует моим потребностям.Выше указано, что я не хочу, но я хотел бы заявить, что я хочу, используя белый список Два вопроса, которые я нашел, частично ответили на этот вопрос. В одном вопросе введен белый список для узлов, в в другом вопросе введен белый список для атрибутов.Как я могу сделать это элегантно в одном белом списке или есть лучший метод?Можно ли это сделать в белом списке вида:
<whitelist>
<node1 attr1="" />
<node2 attr5="" attr6="" />
</whitelist>
Примечание: Я могу использовать только XSLT-1.0
Ожидаемый результат:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<header />
<group>
<node1 attr1="x" />
<node2 attr5="y" attr6="z" />
<node1 attr1="x" />
</group>
</root>
соответствующие вопросы: