我想从已知节点值的XML中删除所有<a></a>
个标记。
例如,XML包含多次出现<a>123</a>
,如果节点值与123
匹配,则应从XML中删除所有节点。
你能帮我解决一下XSLT代码吗?
输入XML:
<z>
<b>
<a>123</a>
<c>
<a>123</a>
<d>text</d>
</c>
<e>
<f>xyz></f>
<a>123</a>
</e>
</b>
<f>
<a>345</a>
</f>
<g>
<a>123</a>
<h>
<a>123</a>
<i></i>
</h>
</g>
</z>
预期输出:
<z>
<b>
<c>
<d>text</d>
</c>
<e>
<f>xyz></f>
</e>
</b>
<f>
<a>345</a>
</f>
<g>
<h>
<i/>
</h>
</g>
</z>
我已将代码用作
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes" />
<xsl:template match="node()|@*" >
<xsl:copy >
<xsl:apply-templates select="node()|@*" />
</xsl:copy >
</xsl:template >
<xsl:template match="z/b/a|z/b/c/a|z/b/e/a|z/g/a|z/g/h/a" />
</xsl:stylesheet >
但路径的硬编码不会始终有效,因为输入XML可能不同。
您能否请一些通用的代码来检查节点的值为'123'并仅删除那些节点。
提前谢谢。
答案 0 :(得分:0)
我首先使用身份转换和<a>123</a>
的覆盖。
请查看以下内容以获取更多信息:
XSLT 2.0
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="a[text()='123']"/>
</xsl:stylesheet>
答案 1 :(得分:0)
<?xml version="1.0" encoding="UTF-8"?>
<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:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match = "a[text() = '123']"/>
</xsl:stylesheet>
输出:
<?xml version="1.0" encoding="UTF-8"?>
<z>
<b>
<c>
<d>text</d>
</c>
<e>
<f>xyz></f>
</e>
</b>
<f>
<a>345</a>
</f>
<g>
<h>
<i/>
</h>
</g>
</z>
此代码将删除所有以'123'作为其值的节点。
<?xml version="1.0" encoding="UTF-8"?>
<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:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match = "node()[text() = '123']"/>
</xsl:stylesheet>