2015-10-14 109 views
0

我在xslt中遇到了問題。我的問題是,我在xml中獲得了一行,應該將其替換爲xsl。我想替換由informatica本身生成的informatica文件。切換頂級元素

起初,這裏是我的xsl:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output 
    method="xml" 
    indent="yes" 
    omit-xml-declaration="no" 
    media-type="string" 
    encoding="ISO-8859-1" 
    doctype-system="deftable.dtd" 
    /> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="//AUTOEDIT2[@NAME='%%PARAM']"> 
     <xsl:choose> 
      <xsl:when test="../JOB[@JOBNAME]='FILE_STUFF'"> 
       <AUTOEDIT2 NAME="%%PARAM" VALUE="*"/> 
      </xsl:when> 
      <xsl:when test="../JOB[@JOBNAME]='DATA_STUFF'"> 
       <AUTOEDIT2 NAME="%%PARAM" VALUE="*"/> 
      </xsl:when> 
      <xsl:when test="../JOB[@JOBNAME]='TANSFER_STUFF'"> 
       <AUTOEDIT2 NAME="%%PARAM" VALUE="*"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <AUTOEDIT2 NAME="%%PARAM" VALUE="20150910"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
    </xsl:stylesheet> 

現在,這是我的XML,在更換時應做到:

<SOMETREE> 
    <JOB JOBNAME="FILE_STUFF"> 
     <AUTOEDIT2 NAME="%%PARAM" VALUE="not so important, should be overwritten"/> 
    </JOB> 
    <JOB JOBNAME="DATA_STUFF"> 
     <AUTOEDIT2 NAME="%%PARAM" VALUE="not so important, should be overwritten"/> 
    </JOB> 
    <JOB JOBNAME="TANSFER_STUFF"> 
     <AUTOEDIT2 NAME="%%PARAM" VALUE="not so important, should be overwritten"/> 
    </JOB> 
    <JOB JOBNAME="OTHER_STUFF"> 
     <AUTOEDIT2 NAME="%%PARAM" VALUE="not so important, should be overwritten"/> 
    </JOB> 
</SOMETREE> 

所以我要覆蓋值 「VALUE」 AUTOEDIT2字段,與JOBNAME相關。

非常感謝您的時間。

問候 比約恩

回答

1

不要使用<xsl:choose>了點。你可以做到這一點通過模板匹配:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="no" /> 
    <xsl:output encoding="ISO-8859-1" doctype-system="deftable.dtd" /> 

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

    <xsl:template match="AUTOEDIT2[@NAME = '%%PARAM' and ../@JOBNAME = 'FILE_STUFF']" priority="1"> 
     <AUTOEDIT2 NAME="%%PARAM" VALUE="*" /> 
    </xsl:template> 

    <xsl:template match="AUTOEDIT2[@NAME = '%%PARAM' and ../@JOBNAME = 'DATA_STUFF']" priority="1"> 
     <AUTOEDIT2 NAME="%%PARAM" VALUE="*" /> 
    </xsl:template> 

    <xsl:template match="AUTOEDIT2[@NAME = '%%PARAM' and ../@JOBNAME = 'TANSFER_STUFF']" priority="1"> 
     <AUTOEDIT2 NAME="%%PARAM" VALUE="*" /> 
    </xsl:template> 

    <xsl:template match="AUTOEDIT2[@NAME = '%%PARAM']" priority="0"> 
     <xsl:copy>20150910</xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

注意的顯式模板的優先級:所有AUTOEDIT2模板默認情況下具有相同的優先級(由XSLT引擎從他們的匹配表達式計算)。設置明確的優先級可以定義哪個模板贏得平局。

任何前三個模板和最後一個模板之間可能發生聯繫。給它一個較低的優先級,確保它只在AUTOEDIT2元素不能與其他三個匹配時才被選中。

由於前三AUTOEDIT2模板期望的結果似乎是一樣的,你可能崩潰他們進入一個:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="no" /> 
    <xsl:output encoding="ISO-8859-1" doctype-system="deftable.dtd" /> 

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

    <xsl:template match="AUTOEDIT2[@NAME = '%%PARAM' and 
     (
     ../@JOBNAME = 'FILE_STUFF' 
     or ../@JOBNAME = 'DATA_STUFF' 
     or ../@JOBNAME = 'TANSFER_STUFF' 
    ) 
    ]" priority="1"> 
     <AUTOEDIT2 NAME="%%PARAM" VALUE="*" /> 
    </xsl:template> 

    <xsl:template match="AUTOEDIT2[@NAME = '%%PARAM']" priority="0"> 
     <xsl:copy>20150910</xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

另一種方式把匹配表達式是:

JOB[ 
    @JOBNAME = 'FILE_STUFF' or @JOBNAME = 'DATA_STUFF' or @JOBNAME = 'TANSFER_STUFF' 
]/AUTOEDIT2[@NAME = '%%PARAM']