在顶级元素之间切换



我在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>

所以我想覆盖AUTOEDIT2字段中与JOBNAME相关的值" value "。

非常感谢你的时间。

致以最亲切的问候Bjorn

不要使用<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']

相关内容

  • 没有找到相关文章

最新更新