你好我一直试图删除xml的某些部分一段时间,它根本不适合我。让我首先列出我的要求:
1。删除所有值为空的节点属性或值'length< 1例如:
<pr:Text default="" approved="true" type="">Mon-Sun 12HR</pr:Text>
应该成为<pr:Text approved="true">Mon-Sun 12HR</pr:Text>
我想我已经知道了这一部分(我想),如果我错了,请纠正我:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:if test=". != ''">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
2. 删除其子级没有文本值的整个节点(元素),例如:
<pr:WorkingHoursInfo>
<pr:WorkingHoursList>
<pr:WorkingHours dayOfweek="MONDAY">
</pr:WorkingHours>
<pr:WorkingHours dayOfweek="TUESDAY">
</pr:WorkingHours>
<pr:WorkingHours dayOfweek="WEDNESDAY">
</pr:WorkingHours>
<pr:WorkingHours dayOfweek="THURSDAY">
</pr:WorkingHours>
<pr:WorkingHours dayOfweek="FRIDAY">
</pr:WorkingHours>
<pr:WorkingHours dayOfweek="SATURDAY">
</pr:WorkingHours>
<pr:WorkingHours dayOfweek="SUNDAY">
</pr:WorkingHours>
</pr:WorkingHoursList>
</pr:WorkingHoursInfo>
应该成为:
<pr:WorkingHoursInfo>
</pr:WorkingHoursInfo>
所以如果可能的话,我应该一次完成这两个转换。我目前仍然坚持这个#2任何帮助是适当的
问题更新:
每Martin Honnen
个答案将xsl文件更改为:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*[not(normalize-space())]"/>
<xsl:template match="*[not(*/*) and not(*[normalize-space()])]"/>
</xsl:stylesheet>
但现在违反了要求 1。,现在{x}已从xml中删除{。}}。
另一次更新:
来自<pr:Text default="" approved="true" type="">Mon-Sun 12HR</pr:Text>
的几乎正常工作,因此Martin Honnen
正在运作,1
正在运作(差不多)。一个例外是没有没有文本值的子元素的单个元素没有被删除,即:
2
这也应该删除。所以它几乎正常运作。
答案 0 :(得分:1)
你从
开始<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
然后为您拥有的任务添加模板,例如
<xsl:template match="@*[not(normalize-space())]"/>
确保删除空属性
<xsl:template match="*[not(normalize-space()) and not(*/*) and not(*[normalize-space()])]"/>
确保删除没有任何大子元素且没有包含文本的子元素的元素。
[编辑] 这是一个完整的样式表
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*[not(normalize-space())]"/>
<xsl:template match="*[not(normalize-space()) and not(*/*) and not(*[normalize-space()])]"/>
</xsl:stylesheet>
当我使用Saxon 6.5.5在输入上应用该样式表时
<pr:root
xmlns:pr="http://example.com/pr">
<pr:WorkingHoursInfo>
<pr:WorkingHoursList>
<pr:WorkingHours dayOfweek="MONDAY">
</pr:WorkingHours>
<pr:WorkingHours dayOfweek="TUESDAY">
</pr:WorkingHours>
<pr:WorkingHours dayOfweek="WEDNESDAY">
</pr:WorkingHours>
<pr:WorkingHours dayOfweek="THURSDAY">
</pr:WorkingHours>
<pr:WorkingHours dayOfweek="FRIDAY">
</pr:WorkingHours>
<pr:WorkingHours dayOfweek="SATURDAY">
</pr:WorkingHours>
<pr:WorkingHours dayOfweek="SUNDAY">
</pr:WorkingHours>
</pr:WorkingHoursList>
</pr:WorkingHoursInfo>
<pr:Text default="" approved="true" type="">Mon-Sun 12HR</pr:Text>
<pr:DescriptionAttribute Type="PRIMARY"/>
</pr:root>
然后结果是
<pr:root xmlns:pr="http://example.com/pr">
<pr:WorkingHoursInfo>
</pr:WorkingHoursInfo>
<pr:Text approved="true">Mon-Sun 12HR</pr:Text>
</pr:root>
因此删除了空元素<pr:DescriptionAttribute Type="PRIMARY"/>
。