【问题标题】:replace tag value recusersivly in xml payload在 xml 有效负载中recusersivly 替换标记值
【发布时间】:2020-12-26 17:32:04
【问题描述】:

我有一个包含许多孩子的 xml 有效负载,并且有标签

<DomainName>value</DomainName>
<DOMAIN_NAME>value</DOMAIN_NAME>

我想要做的是遍历整个 xml 有效负载,并使用 xsl 代码将它们替换为新值

例如,这是一个示例负载

<TransmissionHeader xmlns:tran="http://xmlns.oracle.com/apps/otm/TransmissionService" xmlns="">
            <Version>20b</Version>
            <TransmissionCreateDt>
                <GLogDate>20200819124057</GLogDate>
                <TZId>UTC</TZId>
                <TZOffset>+00:00</TZOffset>
            </TransmissionCreateDt>
            <TransactionCount>1</TransactionCount>
            <SenderHostName>https://xxx</SenderHostName>
            <SenderSystemID>https:xxx</SenderSystemID>
            <UserName>OOO</UserName>
            <SenderTransmissionNo>404836</SenderTransmissionNo>
            <ReferenceTransmissionNo>0</ReferenceTransmissionNo>
            <GLogXMLElementName>PlannedShipment</GLogXMLElementName>
            <NotifyInfo>
                <ContactGid>
                    <Gid>
                        <DomainName>OOO</DomainName>
                        <Xid>SYS</Xid>
                    </Gid>
                </ContactGid>
                <ExternalSystemGid>
                    <Gid>
                        <DOMAIN_NAME>OOO</DOMAIN_NAME>
                        <Xid>IOT_SYSTEM</Xid>
                    </Gid>
                </ExternalSystemGid>
            </NotifyInfo>
        </TransmissionHeader>

它应该用新值替换标签。 如何实现?

 <xsl:template match="/" xml:id="id_11">
      <nstrgmpr:POST xml:id="id_12">
         <nstrgmpr:request-wrapper xml:id="id_26">
            <ns26:input xml:id="id_27">
               <xsl:copy-of xml:id="id_28" select=" /nssrcmpr:publish/Transmission/TransmissionHeader"/>

            </ns26:input>
            <ns26:newDomain xml:id="id_29">d1</ns26:newDomain>
         </nstrgmpr:request-wrapper>
      </nstrgmpr:POST>
   </xsl:template>

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    将以下样式表应用于您的输入:

    XSLT 1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:param name="new-domain-name">new.domain.com</xsl:param>
    
    <!-- identity transform -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="DomainName | DOMAIN_NAME">
        <xsl:copy>
            <xsl:value-of select="$new-domain-name"/>
        </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>
    

    将产生:

    结果

    <?xml version="1.0" encoding="UTF-8"?>
    <TransmissionHeader xmlns:tran="http://xmlns.oracle.com/apps/otm/TransmissionService" xmlns="">
      <Version>20b</Version>
      <TransmissionCreateDt>
        <GLogDate>20200819124057</GLogDate>
        <TZId>UTC</TZId>
        <TZOffset>+00:00</TZOffset>
      </TransmissionCreateDt>
      <TransactionCount>1</TransactionCount>
      <SenderHostName>https://xxx</SenderHostName>
      <SenderSystemID>https:xxx</SenderSystemID>
      <UserName>OOO</UserName>
      <SenderTransmissionNo>404836</SenderTransmissionNo>
      <ReferenceTransmissionNo>0</ReferenceTransmissionNo>
      <GLogXMLElementName>PlannedShipment</GLogXMLElementName>
      <NotifyInfo>
        <ContactGid>
          <Gid>
            <DomainName>new.domain.com</DomainName>
            <Xid>SYS</Xid>
          </Gid>
        </ContactGid>
        <ExternalSystemGid>
          <Gid>
            <DOMAIN_NAME>new.domain.com</DOMAIN_NAME>
            <Xid>IOT_SYSTEM</Xid>
          </Gid>
        </ExternalSystemGid>
      </NotifyInfo>
    </TransmissionHeader>
    

    【讨论】:

    • 它有效,但我正在尝试将新域值作为参数传递,请问如何实现?
    • 这取决于您使用的 XSLT 处理器以及您如何调用转换。它不是 XSLT 的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2011-01-07
    • 2013-05-04
    • 2013-11-19
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多