2017-08-04 92 views
0

我想使用XSL刪除不需要的空間元素。需要刪除不需要的空間元素

XML我測試:

<Body> 
    <h1>abc</h1> 
    <h1>efg</h1> 
    <p>efgh</p> 
    <h1> </h1> 
</Body> 

XSL我使用:

<xsl:template match="Body"> 
    <xsl:copy> 
     <xsl:for-each-group select="*" group-adjacent="boolean(self::h1)"> 
     <xsl:choose> 
      <xsl:when test="current-grouping-key()"> 
       <h1> 
        <xsl:apply-templates select="current-group()/node()"/> 
       </h1> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:apply-templates select="current-group()"/> 
      </xsl:otherwise> 
     </xsl:choose> 
     </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

輸出我得到:

<Body> 
    <h1>abcefg</h1> 
    <p>efgh</p> 
    <h1> </h1> 
</Body> 

輸出我想:

<Body> 
    <h1>abcefg</h1> 
    <p>efgh</p> 
</Body> 

我需要刪除具有空間值的元素。請指教。在此先感謝

+0

我認爲你需要更詳細地解釋你的輸入可以看起來怎麼樣,並且導致你想要的,什麼是應該,如果發生最後一個'h1'元素是否爲空或僅填充空白,但包含一些數據?你想要一組新的'h1'元素嗎? –

回答

0

我假設,通過你寫你的XSL文件的方式,你只希望合併h1元素。我進一步假設你只有希望刪除「空白」h1元素。 (這是一個非常簡單的修改,如果這些假設是不正確的)

考慮到這一點,這裏是實現所需的輸出的一種方式:

<xsl:strip-space elements="h1" /> 
<xsl:template match="Body"> 
    <xsl:copy> 
    <xsl:for-each-group select="*" group-adjacent="boolean(self::h1)"> 
     <xsl:choose> 
     <xsl:when test="current-grouping-key()"> 
      <xsl:if test="string-length(current-group()) > 0"> 
      <xsl:copy> 
       <xsl:apply-templates select="current-group()"/> 
      </xsl:copy> 
      </xsl:if> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:for-each select="current-group()"> 
      <xsl:copy> 
       <xsl:apply-templates/> 
      </xsl:copy> 
      </xsl:for-each> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

具有擴展XML輸入,以展示我的假設:

<Body> 
    <h1>abc</h1> 
    <h1>efg</h1> 
    <p>efgh</p> 
    <p>ijkl</p> 
    <h2>mnop</h2> 
    <h1> </h1> 
    <p> </p> 
</Body> 

輸出爲:

<Body> 
    <h1>abcefg</h1> 
    <p>efgh</p> 
    <p>ijkl</p> 
    <h2>mnop</h2> 
    <p> </p> 
</Body> 

的關鍵解決方案是將xsl:strip-space元素與string-length()函數結合在一起。這實際上導致每個h1元素都帶有的任何數量,並且僅僅是空白區域被移除。

我還修復了第二個xsl:apply-templates元素的一個重大錯誤,這會導致每個連續的非h1元素序列被裸露在一起。 (您可以通過在設置current-group()節點的所有節點都需要循環來避免這種情況。)

+0

謝謝@robin。它的工作正常 – User501