2010-10-12 119 views
5

是否有可能在處理xml文件時跳過節點。例如說我有以下XML代碼使用XSLT跳過節點

<mycase desc=""> 
    <caseid> id_1234 </caseid> 
    <serid ref=""/>  
    ...... 
    ...... 
    ...... 
</mycase> 

,我想使它看起來像這樣

<mycase desc="" caseid="id_1234"> 
..... 
..... 
</mycase> 

目前我在做這個

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet version="2.0" exclude-result-prefixes="xs xdt err fn" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:fn="http://www.w3.org/2005/xpath-functions" 
      xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" 
      xmlns:err="http://www.w3.org/2005/xqt-errors"> 

      <xsl:output method="xml" indent="yes"/> 
      <xsl:template match="/"> 
      <xsl:apply-templates/> 
      </xsl:template> 

     <xsl:template match="mycase">   
      <xsl:element name="mycase"> 
       <xsl:attribute name="desc"/> 
       <xsl:attribute name="caseid"> 
       <xsl:value-of select="caseid"/> 
       </xsl:attribute> 
       <xsl:apply-templates/> 
      </xsl:element> 
     </xsl:template> 
     ...... 
     ...... 

這並不創造什麼我想要它但因爲

<xsl:apply-template/> 

它處理所有的節點。而我希望它可以跳過處理caseid並將它們一起清除。這也適用於其他節點,這在新的XML結構中將不可用。 那麼,如何跳過我不想使用xslt進行處理的節點。

問候, 日Ehsan

回答

8

您可以使用空模板來抑制你的輸入文檔中的某些節點的輸出:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="mycase"> 
    <mycase caseid="{caseid}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </mycase> 
    </xsl:template> 

    <xsl:template match="caseid|serid"/> 

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

</xsl:stylesheet> 
+0

+1好答案。 – 2010-10-12 15:48:16

2

使用<xsl:apply-templates select="mycase"/>代替<xsl:apply-templates />

基本上,你需要做的是應用上只是一個特定節點集模板。在你的情況下,只是'mycase'節點。

4

或許要做到這一點最簡單的方法,就是增加匹配caseid模板,並將它什麼都不做,像這樣:

<xsl:template match="caseid"/> 

通過將這添加到您現有的XSL中,將忽略caseid元素。

另一個解決方案是隻使用上不匹配的名稱caseid元素xsl:apply-elements,即:

<xsl:template match="mycase">   
     <xsl:element name="mycase"> 
      <xsl:attribute name="desc"/> 
      <xsl:attribute name="caseid"> 
      <xsl:value-of select="caseid"/> 
      </xsl:attribute> 
      <xsl:apply-templates select="*[name() != 'caseid']"/> 
     </xsl:element> 
</xsl:template> 

希望這會有所幫助,祝你好運!