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 以字符串替换的形式对 HTML 文档应用编辑