使用XSL替换XML中的部分文本

时间:2015-07-16 14:57:09

标签: xml xslt

我正在尝试使用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>

1 个答案:

答案 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()"/>指令 - 否则原始文本将附加到更正的指令。