2017-05-23 67 views
0

是否有人知道如何使用xslt轉換去除xml中所有子節點的內容。使用xslt清除xml中的所有子節點和節點值

源代碼

<TotalResponse id="TE2146D7766F24FE683090325091EE0B4"> 
    <TotalCovIA27_CrimeResponse id="T8550FBBC76364CA699158D4087059F9A"> 
      <CovIA27_CrimeResponse> 
      <instance> 
       <CovGroupType>i8BE0F604FF6F44AEB3C36271DCBB7204</CovGroupType> 
       <CovID>r67F85BB6345E4D3893C25D1B47FA7E32</CovID> 
       <CovType>add</CovType> 
      </instance> 
      </CovIA27_CrimeResponse> 
     </TotalCovIA27_CrimeResponse> 
     <TotalCovIA28_CrimeResponse id="T257F4902E7214C58ABD9258860CB6C24"> 
      <CovIA28_CrimeResponse> 
      <instance> 
       <CovGroupType>i2880CCCAB9D045A3A7FFFCB6AE0C05C7</CovGroupType> 
       <CovID>rED310B0934534A8BA1CA2B5CB0BA77E5</CovID> 
       <CovType>modify</CovType> 
      </instance> 
      <change> 
       <ChangeFieldID>IA28ForgeryAndAlterationInput.Limit</ChangeFieldID> 
       <ChangeNewValue>131334</ChangeNewValue> 
      </change> 
      </CovIA28_CrimeResponse> 
     </TotalCovIA28_CrimeResponse> 

    </TotalResponse> 

預期輸出1

<TotalResponse id="TE2146D7766F24FE683090325091EE0B4"> 
    <TotalCovIA27_CrimeResponse id="T8550FBBC76364CA699158D4087059F9A"> 
      <CovIA27_CrimeResponse> 
      <instance> 
       <CovGroupType></CovGroupType> 
       <CovID></CovID> 
       <CovType></CovType> 
      </instance> 
      </CovIA27_CrimeResponse> 
     </TotalCovIA27_CrimeResponse> 
     <TotalCovIA28_CrimeResponse id="T257F4902E7214C58ABD9258860CB6C24"> 
      <CovIA28_CrimeResponse> 
      <instance> 
       <CovGroupType></CovGroupType> 
       <CovID></CovID> 
       <CovType></CovType> 
      </instance> 
      <change> 
       <ChangeFieldID></ChangeFieldID> 
       <ChangeNewValue></ChangeNewValue> 
      </change> 
      </CovIA28_CrimeResponse> 
     </TotalCovIA28_CrimeResponse> 

    </TotalResponse> 

預期輸出2

<TotalResponse id="TE2146D7766F24FE683090325091EE0B4"> 
    <TotalCovIA27_CrimeResponse id="T8550FBBC76364CA699158D4087059F9A"> 
      <CovIA27_CrimeResponse> 
      <instance\> 
      </CovIA27_CrimeResponse> 
     </TotalCovIA27_CrimeResponse> 
     <TotalCovIA28_CrimeResponse id="T257F4902E7214C58ABD9258860CB6C24"> 
      <CovIA28_CrimeResponse> 
      <instance/>        
      <change/> 
      </CovIA28_CrimeResponse> 
     </TotalCovIA28_CrimeResponse> 
    </TotalResponse> 

無論是出put會滿足我的要求,但我更喜歡輸出1.

注意: Total Response是根據其他xslt的輸出而變化的動態父根名稱。

+0

你首先必須澄清你想要的。您的(或您的XSL處理器)如何識別要修改的元素?你甚至需要識別它們嗎?例如,從文檔中去除所有'text()'節點是否可以接受?你有什麼嘗試過? –

回答

0

正如我所看到的,您需要針對 instancechange元素的兒童進行「特殊處理」。

在第一個變體中,您只想保留其內容不包含 的標籤,而在第二個變體中完全省略這些元素 。

因此,第一種情況的解決方案是匹配 子模塊instancechange的模板,無論它們是什麼。 該模板的內容應該僅包括<xsl:copy/>, ,即僅使這些元素的淺拷貝

該腳本還必須包含身份模板。

下面你有第一種變體的解決方案:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="instance/* | change/*"> 
    <xsl:copy/> 
    </xsl:template> 

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

工作原理:

讓從月底開始 - 在身份模板match="node() | @*")。 它將所有源內容複製到輸出。 這是「最普通的」模板,服務於其他 (更具體)模板未提供服務的所有節點。欲瞭解更多詳情,請搜索網頁。

現在轉到模板匹配"instance/* | change/*"。 該match子句包含2個部分:instance/*change/* 分離用|(一個總和操作者兩種以上的XPath 表達式)。

這意味着:該模板將成爲其是 的instance兒童或的change子的每個元素(和如上所述將不會爲身份模板 (不會被施加到)它們)。

現在來看這個模板的內容:<xsl:copy/>。 該命令執行所謂的淺拷貝,即它僅應對 輸出的空白「原始」標籤。 例如源元素<CovID>r67F8...7E32</CovID>將被輸出爲 <CovID/>。有關更多詳細信息,您還可以搜索網頁。

有關細節還有一個備註:

如果試過了這個劇本,你細心,你可能已經注意到,而不是如<CovID></CovID>輸出包含<CovID/>

沒問題,從「XML的角度來看」這是相同的,但更短。 這就是(我想所有)XSLT處理器產生空的元素的方式。

如果你想收到預期輸出2(你的第二個變體), 然後從匹配的 instancechange兒童模板中刪除<xsl:copy/>

其實,你可以在更簡潔的方式寫這個模板:

<xsl:template match="instance/* | change/*"/> 

,所以你得到一個什麼都不做模板。

+0

謝謝它爲我工作。你是否也可以向我提供解釋,因爲我對xslt是新手而無法理解它的工作原理。 –

+0

爲什麼你說「讓我們從最後開始」,xslt總是從最後開始還是僅僅這個xslt? –

+0

我想,如果我從身份模板開始,解釋會更自然。 –

0

如何刪除所有子節點的內容在XML

目前尚不清楚你所說的「子節點」的意思。它看起來像你只是想從輸入中刪除所有文本節點 - 這是很容易使用要做到:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="@*|*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|*"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

這種簡單的拷貝元素和它們的屬性和丟棄的任何節點其他類型。