XSLT 1.0 替换字符串

XSLT 1.0 replace string

我有 XML 个这样的样本

<?xml version="1.0" encoding="utf-8"?>
<Class xmlns="http://localhost/00">    
    <Student>
        <Profile>
            <Name>G1</Name>
            <City>PNH</City>            
            <RegisterDate>2020-06-20</RegisterDate>
        </Profile>
        <Origin>
            <Address>
                <City>REP</City>
            </Address> 
        </Origin>
        <LoginTime OperationQualifier="LGI">2020-06-20T04:03:01Z</LoginTime>
    </Student>   
</Class>

我想把Z里面的+07:00换成这样,这样最后的结果应该是

<?xml version="1.0" encoding="UTF-8"?>
<Class xmlns="http://localhost/00">
   <Student>
      <Profile>
         <Name>G1</Name>
         <City>PNH</City>
         <RegisterDate>2020-06-20</RegisterDate>
      </Profile>
      <Origin>
         <Address>
            <City>REP</City>
         </Address>
      </Origin>
      <LoginTime OperationQualifier="LGI">2020-06-20T04:03:01+07:00</LoginTime>
</Student>
</Class>

我尝试了以下 XSLT 定义,但结果似乎不符合我的预期,因为它从上下文中删除了元素 LoginTime

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="http://localhost/00"
    >
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="Student[not(Profile/City = 'PNH')]"/>

<xsl:template match="ns0:LoginTime">
  <xsl:call-template name="globalReplace">
      <xsl:with-param name="outputString" select="."/>
      <xsl:with-param name="target" select="'Z'"/>
      <xsl:with-param name="replacement" select="'+07:00'"/>
  </xsl:call-template>
</xsl:template>
 
 <xsl:template name="globalReplace">
      <xsl:param name="outputString"/>
      <xsl:param name="target"/>
      <xsl:param name="replacement"/>
      <xsl:choose>
        <xsl:when test="contains($outputString,$target)">
          <xsl:value-of select=   "concat(substring-before($outputString,$target),
                   $replacement)"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$outputString"/>
        </xsl:otherwise>
      </xsl:choose>
</xsl:template>

</xsl:stylesheet>

我应该有一些不正确的地方,这就是为什么它生成的结果不是我预期的那样。你介意指导我如何用 +07:00 替换 Z 吗?

您需要将元素名称LoginTime复制到结果中。因此,请尝试将 ns0:LoginTime 的当前模板替换为以下内容:

<xsl:template match="ns0:LoginTime">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:call-template name="globalReplace">
           <xsl:with-param name="outputString" select="."/>
           <xsl:with-param name="target" select="'Z'"/>
           <xsl:with-param name="replacement" select="'+07:00'"/>
        </xsl:call-template>
    </xsl:copy>
</xsl:template>

你不能简单地做:

<xsl:template match="ns0:LoginTime">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:value-of select="substring-before(., 'Z')"/>
        <xsl:text>+07:00</xsl:text>
    </xsl:copy>
</xsl:template>