我不知道如何为此编写XSLT。
这是我的XML文件
<?xml version="1.0" encoding="UTF-8"?>
<people>
<person>
<firstname>Mike</firstname>
<lastname>Hewitt</lastname>
<licenses/>
<license-details>
<tag1>xyz</tag1>
</license-details>
</person>
<person>
<firstname>Mike</firstname>
<lastname>Hewitt</lastname>
<licenses>
<state>NY</state>
</licenses>
<license-details>
<tag1>xyz</tag1>
</license-details>
</person>
</people>
我想要实现的是,如果license-details
标记为空,我想删除licenses
标记
这是输出的方式:
<?xml version="1.0" encoding="UTF-8"?>
<people>
<person>
<firstname>Mike</firstname>
<lastname>Hewitt</lastname>
</person>
<person>
<firstname>Mike</firstname>
<lastname>Hewitt</lastname>
<licenses>
<state>NY</state>
</licenses>
<license-details>
<tag1>xyz</tag1>
</license-details>
</person>
</people>
有人可以指导我如何为此编写XSLT,我使用的是XSLT 1.0版
答案 0 :(得分:2)
您可以删除节点的一种方法如下:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"
omit-xml-declaration="no"
encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="licenses[count(node())=0] |
license-details[count(./preceding-sibling::licenses/node())=0]"/>
</xsl:stylesheet>
XML输出:
<?xml version="1.0" encoding="UTF-8"?>
<people>
<person>
<firstname>Mike</firstname>
<lastname>Hewitt</lastname>
</person>
<person>
<firstname>Mike</firstname>
<lastname>Hewitt</lastname>
<licenses>
<state>NY</state>
</licenses>
<license-details>
<tag1>xyz</tag1>
</license-details>
</person>
</people>
最后一个模板匹配没有子节点的所有licenses
- licenses[count(node())=0]
- 以及所有license-details
具有前一个兄弟licenses
且没有任何子节点的license-details[count(./preceding-sibling::licenses/node())=0]
- {{1}} 。因为这个空模板不产生输出,所以两者都不会被写入输出。