我正在尝试使用XSL替换部分文本。 XSL还做了其他两件事,它们工作正常。
这是源XML
<PublishFACSR xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2015-07-14T09:23:24-06:00" transLanguage="EN" baseLanguage="EN" messageID="1436887397443667260" maximoVersion="7 5 20140411-2000 V7511--1" event="1">
<FACSRSet>
<SR action="Replace">
<TICKETID>SR-35102</TICKETID>
</SR>
</FACSRSet>
</PublishFACSR>
这是我正在尝试的XSL,我的问题是最后一节。我只需要将TICKETID中的文本从SR-35102更改为EX-35102
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:ibm ="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:template match="ibm:PublishFACSR">
<SyncFACSR xmlns="http://www.ibm.com/maximo">
<xsl:apply-templates select="@*|node()"/>
</SyncFACSR>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- exception-->
<xsl:template match="ibm:SR/@action[.='Replace']" >
<xsl:attribute name="action">AddChange</xsl:attribute>
</xsl:template>
<!-- Substitute the SR on <ticketid> with EX -->
<xsl:template match="TICKETID">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:value-of select="concat('EX', substring-after( @TICKETID, 'SR'))"/>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
您是否从your previous question了解到XMl中的元素是否在命名空间中并且需要使用前缀来解决?
与您使用的方式相同:
<xsl:template match="ibm:PublishFACSR">
和
<xsl:template match="ibm:SR/@action[.='Replace']" >
您还必须制作新模板:
<xsl:template match="ibm:TICKETID">
否则它将无法匹配任何内容而无法做任何事情。
修复后,您需要使用对当前节点的引用替换对不存在的属性@TICKETID
的引用:
substring-after(., 'SR')
而不是:
substring-after( @TICKETID, 'SR')
最后,删除<xsl:apply-templates select="node()"/>
指令 - 否则原始文本将附加到更正的指令。