XSLT 1.0移动一个段



请告诉我,如何将" bgm"段从" cnt"移至" grp"?

实际上XML:

<?xml version="1.0"?>
<SEEDELFOR>
	<AG/>
	<CNT>
		<TRANSMISSION_DATE>20190307</TRANSMISSION_DATE>
		<TRANSMISSION_TIME>113300</TRANSMISSION_TIME>    		</INTERCHANGE_CONTROL_NUMBER>
		</SENDER>
		</SENDER_QUALIFIER>
		</RECEIVER>
		</RECEIVER_QUALIFIER>
		</SYNTAX_IDENTIFIER>
		</SYNTAX_VERSION>
		<BGM>227</BGM>
		<GRP>			
			</IDENTIFIER_BY>
			</IDENTIFIER_SU>
			</DATE_4>
			</REF_ON>    			
		</GRP>
	</CNT>
</SEEDELFOR>

正确的XML输出应为:

<?xml version="1.0"?>
<SEEDELFOR>
	<AG/>
	<CNT>
		<TRANSMISSION_DATE>20190307</TRANSMISSION_DATE>
		<TRANSMISSION_TIME>113300</TRANSMISSION_TIME>
		<SENDER></SENDER>
		</SENDER_QUALIFIER>
		</RECEIVER>
		</RECEIVER_QUALIFIER>
		</SYNTAX_IDENTIFIER>
		</SYNTAX_VERSION>		
		<GRP>
      <BGM>227</BGM>    			   			
		</GRP>
	</CNT>
</SEEDELFOR>

这是我的XSLT:我尝试复制,但我认为移动细分市场更好?

编辑:多数民众赞成在我的完整XSLT:也许我必须与其他副本片段兼容?

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>
    
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    
<!--Copy all of CNT != BGM-->    
<xsl:template match="CNT">
    <xsl:copy>
        <xsl:apply-templates select="*[local-name()!='BGM']" />
    </xsl:copy>
</xsl:template>
<!--copy BGM from CNT to GRP-->
<xsl:template match="GRP">
    <xsl:element name="GRP">
        <xsl:apply-templates />
        <xsl:copy-of select="../BGM" />
    </xsl:element>
</xsl:template>
<!--copy the data from ADD/CONTACT with Qualifier EM to GRP, so it can be used in the mapping to set EMAIL from Customer-->
<xsl:template match="GRP">
    <xsl:copy>
        <xsl:for-each select ="./ADD/CONTACT">
         <xsl:if test="./QUALIFIER='EM'">          
  <CONTACT_EMAIL>
  <xsl:value-of select="NUMBER"/>      
  </CONTACT_EMAIL>
       </xsl:if>
         <xsl:if test="./QUALIFIER='TE'">          
  <CONTACT_TEL>
  <xsl:value-of select="NUMBER"/>      
  </CONTACT_TEL>
       </xsl:if>
         <xsl:if test="./QUALIFIER='FX'">          
  <CONTACT_FAX>
  <xsl:value-of select="NUMBER"/>      
  </CONTACT_FAX>
       </xsl:if>
      </xsl:for-each>
    <!--copy all other nodes-->
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  
  <!--delete IC node-->
  <xsl:template match="IC" />
  
  <!--delete FILTER_SET node-->
  <xsl:template match="FILTER_SET" />
 
  <!--delete SEE_AG node-->
  <xsl:template match="SEE_AG" />
  <!--delete ME node-->
  <xsl:template match="ME" />
  
    <!--delete ADD node-->
  <xsl:template match="ADD" />
  
  <!-- delete segment (ADD) with specified QUALIFER (SU)  -->
  <xsl:template match="ADD[QUALIFIER='SU']"/> 
  
  <!--delete TRANSPORT_DETAILS node-->
  <xsl:template match="TRANSPORT_DETAILS" />
  
  <!--delete PACKAGE_DETAILS node-->
  <xsl:template match="PACKAGE_DETAILS" />
  
  <!--delete AMOUNT_DETAILS node-->
  <xsl:template match="AMOUNT_DETAILS" />
  
    <!--delete IC node-->
  <xsl:template match="CONTACT" />
  
   <!-- delete empty nodes -->
 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>
 <xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>
<!-- delete empty nodes -->  
  
</xsl:stylesheet>

感谢您的帮助。

最好的问候朱利安

"将"节点从一个地方移动到另一个位置的惯用方法是:

  • 按原样复制所有内容,
  • 除了所讨论的节点,
  • 将节点复制到其新位置:

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="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<!-- remove BGM -->
<xsl:template match="BGM"/>
<xsl:template match="GRP">
    <xsl:copy>
        <xsl:apply-templates/>
        <!-- add BGM -->
        <xsl:copy-of select="../BGM" />
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

如果您需要修改其他节点,请在必要时添加匹配它们的模板。

似乎您的XML形成不佳。如果我做到了,那么您可以在XSLT下找到您的要求:

XML可以是:

<?xml version="1.0"?>
<SEEDELFOR>
<AG />
<CNT>
    <TRANSMISSION_DATE>20190307</TRANSMISSION_DATE>
    <TRANSMISSION_TIME>113300</TRANSMISSION_TIME>
    <INTERCHANGE_CONTROL_NUMBER />
    <SENDER />
    <SENDER_QUALIFIER />
    <RECEIVER />
    <RECEIVER_QUALIFIER />
    <SYNTAX_IDENTIFIER />
    <SYNTAX_VERSION />
    <BGM>227</BGM>
    <GRP>
        <IDENTIFIER_BY />
        <IDENTIFIER_SU />
        <DATE_4 />
        <REF_ON />
    </GRP>
</CNT>
</SEEDELFOR>

解决方案将是:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="*">
    <xsl:copy>
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>
<xsl:template match="CNT">
    <xsl:copy>
        <xsl:apply-templates select="*[local-name()!='BGM']" />
    </xsl:copy>
</xsl:template>
<xsl:template match="GRP">
    <xsl:element name="GRP">
        <xsl:apply-templates />
        <xsl:copy-of select="../BGM" />
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

http://xsltransform.net/eiee3q5

<!-- remove BGM at CNT-->
<xsl:template match="BGM"/>
<!--copy the data from ADD/CONTACT with Qualifier EM to GRP, so it can be used in the mapping to set EMAIL from Customer-->
<xsl:template match="GRP">
    <xsl:copy>
        <xsl:for-each select ="./ADD/CONTACT">
         <xsl:if test="./QUALIFIER='EM'">          
  <CONTACT_EMAIL>
  <xsl:value-of select="NUMBER"/>      
  </CONTACT_EMAIL>
       </xsl:if>
         <xsl:if test="./QUALIFIER='TE'">          
  <CONTACT_TEL>
  <xsl:value-of select="NUMBER"/>      
  </CONTACT_TEL>
       </xsl:if>
         <xsl:if test="./QUALIFIER='FX'">          
  <CONTACT_FAX>
  <xsl:value-of select="NUMBER"/>      
  </CONTACT_FAX>
       </xsl:if>
      </xsl:for-each>
    <!--copy BGM from CNT to GRP -->
      <xsl:copy-of select="../BGM" />
    <!--copy all other nodes-->
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

相关内容

  • 没有找到相关文章

最新更新