使用 XSLT 将巨大的 XML 中的白名单(a.k.a。白名单)XML 字段列入白名单
Allowlisting (a.k.a. Whitelisting) XML fields from huge XML with XSLT
我想清空一个非常大的 XML 中的所有字段,除了某些字段(在这个例子中,字段姓氏和来自较低节点的城市纽约)。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8" omit-xml-declaration="yes"/>
<SomeName>
<identifier>
<name>Peter</name>
<surname>Smith</surname>
<city>London</city>
</identifier>
<MainNode1>
<SubNode1>
<street>Main Street</street>
<city>New York</city>
</SubNode1>
</MainNode1>
</SomeName>
...
它应该是这样的:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8" omit-xml-declaration="yes"/>
<SomeName>
<identifier>
</name>
<surname>Smith</surname>
</city>
</identifier>
<MainNode1>
<SubNode1>
<street/>
<city>New York</city>
</SubNode1>
</MainNode1>
</SomeName>
...
我已经用这个清空了所有字段:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8" omit-xml-declaration="yes"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
现在我只需要有关如何“取消选择”或“将某些字段列入白名单”的信息。还有一些字段在不同的节点中具有相同的名称,所以我想我需要在白名单时指定Xpath。
这是您可以查看的一种方式:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- default behavior for leaf nodes (priority=0.5) -->
<xsl:template match="*[not(*)]">
<xsl:copy/>
</xsl:template>
<!-- override for white-listed nodes -->
<xsl:template match="surname | SubNode1/city" priority="1">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我想清空一个非常大的 XML 中的所有字段,除了某些字段(在这个例子中,字段姓氏和来自较低节点的城市纽约)。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8" omit-xml-declaration="yes"/>
<SomeName>
<identifier>
<name>Peter</name>
<surname>Smith</surname>
<city>London</city>
</identifier>
<MainNode1>
<SubNode1>
<street>Main Street</street>
<city>New York</city>
</SubNode1>
</MainNode1>
</SomeName>
...
它应该是这样的:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8" omit-xml-declaration="yes"/>
<SomeName>
<identifier>
</name>
<surname>Smith</surname>
</city>
</identifier>
<MainNode1>
<SubNode1>
<street/>
<city>New York</city>
</SubNode1>
</MainNode1>
</SomeName>
...
我已经用这个清空了所有字段:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8" omit-xml-declaration="yes"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
现在我只需要有关如何“取消选择”或“将某些字段列入白名单”的信息。还有一些字段在不同的节点中具有相同的名称,所以我想我需要在白名单时指定Xpath。
这是您可以查看的一种方式:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- default behavior for leaf nodes (priority=0.5) -->
<xsl:template match="*[not(*)]">
<xsl:copy/>
</xsl:template>
<!-- override for white-listed nodes -->
<xsl:template match="surname | SubNode1/city" priority="1">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>