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