2012-01-19 126 views
1

我有一個很大的XML文件中設置我的應用程序中刪除評論。每種配置都有很多評論。我想用xsl根據節點刪除一些評論。XSL從特定節點

<!-- if you need to use storage --> 
<Storage> 
    <!-- Oracle configuration 
    <StorageDb database="OracleService"></StorageDb> 
    --> 
    <!-- SqlServer configuration 
    <StorageDb database="SqlService"></StorageDb> 
    --> 
</Storage> 

當我跑我的XSL我想刪除剛剛從Oracle配置的意見,所以我的結果將是:

<!-- if you need to use storage --> 
<Storage> 
    <StorageDb database="OracleService"></StorageDb> 

    <!-- SqlServer configuration 
    <StorageDb database="SqlService"></StorageDb> 
    --> 
</Storage> 

任何想法,我會怎麼做呢?

+2

你的意思是 '取消註釋' 一些節點?換句話說:從評論中提取節點。 – DRCB

+0

是的你是對的 –

+1

爲什麼你想使用XSL呢?如果有辦法實現這樣的轉變 - 那麼XSL將會或多或少地變得醜陋。我會建議簡單的搜索和替換來解決這個問題。 – DRCB

回答

3
<xsl:template match="Storage" > 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="comment()"> 
    <xsl:value-of disable-output-escaping="yes" select="substring-after(.,'Oracle configuration')"/> 
</xsl:template> 
+0

答案並不錯,但請記住,d-o-e只能在有限的情況下工作(例如,當XSLT處理器可以控制序列化時)並且根本不需要遵守。 – LarsH

2

如果我有你的權利,你問他爲什麼不刪除註釋節點,但對它們進行分析,並將其轉化爲元素。你可以用XSLT 2.0和正則表達式來做到這一點,但我認爲這不是一個好主意(不是很強大)。

的XSLT可以幫助你的,但是你首先要建立您的配置文件squelet。讓我們想象一下這樣的事情:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    ... 
    <Storage/> 
    ... 
</configuration> 

你的XSLT可能看起來像:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:param name="service" select="'OracleService'"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Storage"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <StorageDb database="{$service}"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

的默認行爲選擇的service參數的值OracleService。可以通過將另一個值傳遞給此參數的XSLT來覆蓋此行爲。

默認結果是:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    ... 
    <Storage><StorageDb database="OracleService"/></Storage> 
    ... 
</configuration> 
+0

我確實已經在XML文件中存在該節點,但發表了評論。我需要取消註釋該節點。對不起,是否清楚? –

+0

是的,我明白你在XML的意見,我只是想指出的是,在註釋觀更強大的替代可能是帶有輸入參數來構建您的配置文件中的XSLT文件。 –

+0

「不刪除評論節點,但分析它們並將它們轉換爲XML節點」 - 我認爲你的意思是「將它們轉換爲元素」?他們已經是XML節點。 – LarsH

1

如果你可以使用撒克遜作爲XSLT處理器,那麼一個強大的方式來做到這一點(我指的是,一個方法,它不依賴於disable-output-escaping )將在刪除不需要的文本之後,在每個評論節點的內容上使用saxon:parse()saxon:parse()的結果是一個XML節點,可以以正常方式輸出到結果文檔。

例如爲:

<xsl:template match="comment()"> 
    <xsl:copy-of select="saxon:parse(substring-after(., 'configuration'))"/> 
</xsl:template> 

更多的討論,參見XSLT parse text node as XML?

+1

我的理解是,xith'saxon:parse()'函數必須提供一個表示有效XML文檔的字符串(請參見http://www.saxonica。COM /文檔/擴展/功能/ parse.xml)。因此,要在註釋節點上使用此函數,首先必須對文本值('substring','replace' ...)執行一個操作。 –

+0

@VincentBiragnet:你說的沒錯,我假設沒有檢查,parse()可以解析文檔片段。我會相應地編輯我的答案。 – LarsH