XSLT 1.0移动一段

时间:2019-03-07 11:30:52

标签: 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>

感谢您的帮助。

最好的问候 朱利安

3 个答案:

答案 0 :(得分:1)

似乎您的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

答案 1 :(得分: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="*"/>

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

如果需要修改其他节点,请根据需要添加与它们匹配的模板。

答案 2 :(得分:0)

backup