2012-07-23 67 views
2

你好我一直在尝试删除一段时间的xml部分,现在它根本不适合我。首先,我要列举我的要求:xsl转换删除部分xml

卸下所有节点属性,这些属性值是空白或值长度< 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个变换如果可能的话去。我目前停留在此#2任何帮助appriciated

问题更新:

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> 

但现在要求是现在违反<pr:Text default="" approved="true" type="">Mon-Sun 12HR</pr:Text>从xml中被删除。

另一个更新:

Martin Honnen几乎工作,所以1正在工作并且2在工作(几乎)。一个例外是,单独的元素,而它们没有文本值的孩子不被删除即:

<pr:DescriptionAttribute Type="PRIMARY"/>

这应该被删除。所以它几乎工作。

回答

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> 

当我使用撒克逊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"/>

+0

感谢您的回复,请参阅我的更新 – London 2012-07-23 14:16:02

+0

我编辑了一个模板,希望能够防止删除包含文本内容的元素。 – 2012-07-23 14:33:55

+0

好吧,先生,你太亲密了,请看我的更新(+1忘了第一位) – London 2012-07-23 14:41:42