Xcode XSL-我希望替换数据中出现的所有不正确时区
我不熟悉XSL映射。我想替换所有不正确时区的实例。我知道可能发生这种情况的字段的名称。在某些情况下,时区可能是正确的,因此我只想将+01:00替换为+00:00 以下是我输入的内容(大致):Xcode XSL-我希望替换数据中出现的所有不正确时区,xcode,xslt,maps,Xcode,Xslt,Maps,我不熟悉XSL映射。我想替换所有不正确时区的实例。我知道可能发生这种情况的字段的名称。在某些情况下,时区可能是正确的,因此我只想将+01:00替换为+00:00 以下是我输入的内容(大致): 2017-07-14T10:11:20+01:00 100000 2017-07-12T10:11:20+01:00 W1000669 2017-12-14T10:11:20+01:00 100000 2017-12-12T10:12:20+01:00 W1000420 我希望我的输出是这样的: <
2017-07-14T10:11:20+01:00
100000
2017-07-12T10:11:20+01:00
W1000669
2017-12-14T10:11:20+01:00
100000
2017-12-12T10:12:20+01:00
W1000420
我希望我的输出是这样的:
<WORKORDERSet>
<WORKORDER>
<CLIENT_WORKORDER>
<COMPLETION_SLA_DATE>2017-07-14T10:11:20+00:00</COMPLETION_SLA_DATE>
<REGION>100000</REGION>
<RESPONSE_SLA_DATE>2017-07-12T10:11:20+00:00</RESPONSE_SLA_DATE>
<WO_NUM>W1000669</WO_NUM>
</CLIENT_WORKORDER>
</WORKORDER>
<WORKORDER>
<CLIENT_WORKORDER>
<COMPLETION_SLA_DATE>2017-12-14T10:11:20+00:00</COMPLETION_SLA_DATE>
<REGION>100000</REGION>
<RESPONSE_SLA_DATE>2017-12-12T10:12:20+00:00</RESPONSE_SLA_DATE>
<WO_NUM>W1000420</WO_NUM>
</CLIENT_WORKORDER>
</WORKORDER>
</WORKORDERSet>
2017-07-14T10:11:20+00:00
100000
2017-07-12T10:11:20+00:00
W1000669
2017-12-14T10:11:20+00:00
100000
2017-12-12T10:12:20+00:00
W1000420
下面是我尝试使用的XSL,但我不知道我做错了什么:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:max="http://www.ibm.com/maximo" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- identity template: copy everything 1:1 -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!--More specific template for Node766 that provides custom behavior -->
<xsl:template match="WORKORDERSet/CLIENT_WORKORDER/WORKORDER/">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<!--Do something special for Node766, like add a certain string-->
<xsl:choose>
<xsl:param name="text"/>
<xsl:param name="replace"/>
<xsl:param name="by"/>
<xsl:when test="contains($text, $replace)">
<xsl:value-of select="substring-before($text,$replace)"/>
<xsl:value-of select="$by"/>
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="substring-after($text,$replace)"/>
<xsl:with-param name="replace" select="$replace"/>
<xsl:with-param name="by" select="$by"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
对于noob的问题,很抱歉,但在此感谢您的帮助。谢谢 您应该首先准备替换模板,使其成为动态的,然后匹配CLIENT\u WORKORDER-
*[parent::CLIENT\u WORKORDER]
的所有节点,以检查每个节点,并将+01:00
替换为+00:00
,请参见下面的XSL:
<xsl:stylesheet xmlns:max="http://www.ibm.com/maximo" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<!--template with value replacing-->
<xsl:template name="replace-template">
<xsl:param name="param.str"/>
<xsl:param name="param.target"/>
<xsl:param name="param.replacement"/>
<xsl:choose>
<xsl:when test="contains($param.str, $param.target)">
<xsl:value-of select="concat(substring-before($param.str, $param.target), $param.replacement, substring-after($param.str, $param.target))"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$param.str"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--copy all nodes-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--take each element of CLIENT_WORKORDER and if it contains +01:00 it will replace it with +00:00-->
<xsl:template match="*[parent::CLIENT_WORKORDER]">
<xsl:element name="{name()}">
<xsl:call-template name="replace-template">
<xsl:with-param name="param.str" select="."/>
<xsl:with-param name="param.target" select="'+01:00'"/>
<xsl:with-param name="param.replacement" select="'+00:00'"/>
</xsl:call-template>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
结果如预期:
<WORKORDERSet>
<WORKORDER>
<CLIENT_WORKORDER>
<COMPLETION_SLA_DATE>2017-07-14T10:11:20+00:00</COMPLETION_SLA_DATE>
<REGION>100000</REGION>
<RESPONSE_SLA_DATE>2017-07-12T10:11:20+00:00</RESPONSE_SLA_DATE>
<WO_NUM>W1000669</WO_NUM>
</CLIENT_WORKORDER>
</WORKORDER>
<WORKORDER>
<CLIENT_WORKORDER>
<COMPLETION_SLA_DATE>2017-12-14T10:11:20+00:00</COMPLETION_SLA_DATE>
<REGION>100000</REGION>
<RESPONSE_SLA_DATE>2017-12-12T10:12:20+00:00</RESPONSE_SLA_DATE>
<WO_NUM>W1000420</WO_NUM>
</CLIENT_WORKORDER>
</WORKORDER>
</WORKORDERSet>
2017-07-14T10:11:20+00:00
100000
2017-07-12T10:11:20+00:00
W1000669
2017-12-14T10:11:20+00:00
100000
2017-12-12T10:12:20+00:00
W1000420
这里有另一个选项,它只处理名称以\u DATE
结尾的元素中包含+01:00
的文本()
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template
match="*[contains(concat(local-name(),'|'),'_DATE|')]/text()[contains(.,'+01:00')]">
<xsl:value-of select="substring-before(.,'+01:00')"/>
<xsl:text>+00:00</xsl:text>
</xsl:template>
</xsl:stylesheet>
+00:00
谢谢,这对我提出的问题非常有效。不幸的是,我包含的样本非常差。实际上,树中还有一个额外的级别。等。当有额外级别时,家长呼叫不起作用。我仍然缺少一些东西;这完全搞砸了:[parent::QueryWORKORDERResponse/WORKORDERSet/WORKORDER/CLIENT\u WORKORDER]“>@Aporia解决方案在我的回答中应该适用于CLIEN的所有元素T_-WORKORDER,不管是/WORKORDER集/WORKORDER/CLIENT_-WORKORDER还是/WORKORDER集/WORKORDER/x/x/x/x/CLIENT_-WORKORDER。主要是为了保持匹配=“*[parent::CLIENT\u-WORKORDER]“你说得对。我以为我一开始就试过了,但看起来好像没用。。。我不确定它为什么不起作用,但在那里再试了一次,结果没有问题。非常感谢你的回答!您也可以使用CLIENT\u WORKORDER/*
而不是*[parent::CLIENT\u WORKORDER]
(略短/更干净)。这非常适合我需要做的事情。谢谢
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template
match="*[contains(concat(local-name(),'|'),'_DATE|')]/text()[contains(.,'+01:00')]">
<xsl:value-of select="substring-before(.,'+01:00')"/>
<xsl:text>+00:00</xsl:text>
</xsl:template>
</xsl:stylesheet>