XSLT 1.0 替换字符串

Posted

技术标签:

【中文标题】XSLT 1.0 替换字符串【英文标题】:XSLT 1.0 replace string 【发布时间】:2021-10-10 03:02:17 【问题描述】:

我有这样的 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>

我想用 +07:00 替换 Z in,这样最终的结果应该是

<?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>

我应该有一些不正确的东西,这就是为什么它产生的结果不像我预期的那样。您介意指导我如何将 Z 替换为 +07:00 吗?

【问题讨论】:

【参考方案1】:

你不能简单点:

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

【讨论】:

哇,听起来比我强硬的要简单,谢谢【参考方案2】:

您需要将元素名称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>

【讨论】:

以上是关于XSLT 1.0 替换字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSLT 替换 XML 节点名称中的字符 - 更改根元素

XSLT 字符串替换

使用 XSLT 以字符串替换的形式对 HTML 文档应用编辑

xslt 2.0 替换为 xml 结构

XSLT 2.0 - 如何用字符串替换'('和')'来清空?

XSLT 替换属性值和文本节点中的文本