2012-07-23 70 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