2013-10-08 208 views
0

正如標題描述我試圖採取這樣的XML:有條件刪除父節點,如果子節點是空

<Measurement> 
    <Name>Board_1_Output_0</Name> 
    <LongIdentifier>Board 1 Output 0<LongIdentifier/> 
    ... 
    <ECUAddress>2000000F</ECUAddress> 
</Measurement> 
<Measurement> 
    <Name/> 
    <LongIdentifier/> 
    ... 
    <ECUAddress/> 
</Measurement> 

,並有條件地刪除<Measurement>如果<Measurement>子節點都是空這樣的:

<Measurement> 
    <Name>Board_1_Output_0</Name> 
    <LongIdentifier>Board 1 Output 0<LongIdentifier/> 
    ... 
    <ECUAddress>2000000F</ECUAddress> 
</Measurement> 

我目前的XSLT,對於這部分,看起來是這樣的:

<xsl:for-each select="Measurement"> 
    <xsl:text>/begin MEASUREMENT</xsl:text> 
    <xsl:text>/* Name   */&#x09;</xsl:text> 
    <xsl:value-of select ="Name"/> 
    <xsl:apply-templates select="LongIdentifier"> 
    <xsl:text>ECU_ADDRESS&#x09;&#x09;&#x09;&#x09;</xsl:text> 
    <xsl:value-of select ="ECUAddress"/> 
<xsl:text>/end MEASUREMENT</xsl:text> 
</xsl:for-each ><!-- Measurement --> 

我以爲我可以有條件地看每個部分,而不是打印任何<Measurment> XML標籤如果有孩子的標籤是空的,但是,我只能做到在離開父<Measurement>元素,例如:

<Measurement></Measurement> 

是否有當我發現我在同一個xslt樣式表中有一個空的子項時,如何刪除父xml節點?或者,是否需要通過不同的樣式表運行xml以刪除具有空子項的任何XML節點?

+0

不應該同時刪除「測量」標籤,因爲兩者都有一個空的子元素「LongIdentifier」? –

+0

可能重複[刪除父節點,如果一個子節點爲空](http://stackoverflow.com/questions/11539910/remove-parent-node-if-a-child-node-is-empty) –

回答

1

您可以在for-each中使用一些XPath來濾除<Measurement>元素。如果要刪除所有這些元素,其中任何子元素是空的,你可以這樣做:

<xsl:for-each select="Measurement[not(*[. = ''])]"> 
    .... 
</xsl:for-each> 

即只能選擇那裏並沒有任何的子元素是空<Measurement>元素。

+2

或更好,將整個事物移動到模板匹配中,只匹配這個... xsl:template match =「Measurement [not(* [。=''])]」,然後使用apply-templates。 –

+0

@BenL出於某種原因,您的答案無法完全工作 - 添加XPath代碼會刪除所有測量。但是,當我將XPath代碼更改爲'Measurement [not(Name [。=''])]'時,它完美地工作......非常奇怪。但是我正在Excel 2003中進行轉換,所以也許它與此有關。 – larrylampco

+0

@KevinBrown是完全正確的 - 這將是編寫樣式表最習慣的方式。 –