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