Xcode XSL-我希望替换数据中出现的所有不正确时区

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 我希望我的输出是这样的: <

我不熟悉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
我希望我的输出是这样的:

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