否则XSLT1.0-正确的输出

时间:2018-11-29 09:18:33

标签: xslt-1.0

我的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> 
    
<xsl:template match="GRP">
    <xsl:copy>
    <!--copy the data from ADD - ST to the GRP so it can be used in the mapping to set the delivery address from end customer-->
      <xsl:for-each  select ="./ADD">
    	<xsl:if test="./QUALIFIER='ST'">
          <xsl:copy-of select="PARTY_NAME_1"/>    
          <xsl:copy-of select="STREET_1"/>
		  <xsl:copy-of select="CITY"/>
		  <xsl:copy-of select="POSTAL_CODE"/>
		  <xsl:copy-of select="COUNTRY_CODE"/>		  
        </xsl:if>        
        <xsl:choose>
        <xsl:when test="./QUALIFIER='CN'">
		  <CONTACT_NUMBER>
		   <xsl:value-of select="CONTACT/NUMBER"/>
		  </CONTACT_NUMBER>
        </xsl:when>   
          <xsl:otherwise>          
		<xsl:if test="./QUALIFIER='ST'">
		  <CONTACT_NUMBER>
		   <xsl:value-of select="CONTACT/NUMBER"/>
		  </CONTACT_NUMBER>
        </xsl:if>
         </xsl:otherwise>
         </xsl:choose>
      </xsl:for-each>      
  	  <!--copy all other nodes-->
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  
  </xsl:stylesheet>

您能告诉我,我在xml中的错误是什么吗?

  • 在我的代码中,我获得2次Contact_Number。

我就像其中一个...如果在CN处联系-请使用此选项,否则请从ST使用。 ->如果要与CN和ST联系,请使用CN。

编辑:xml:

<SEEDELFOR>
    <GRP>           
    		<ADD>
				<QUALIFIER>CN</QUALIFIER>
				<IDENTIFIER></IDENTIFIER>
				<AGENCY_CODE></AGENCY_CODE>
				<PARTY_NAME_1></PARTY_NAME_1>
				<STREET_1></STREET_1>
				<CITY></CITY>
				<POSTAL_CODE></POSTAL_CODE>
				<COUNTRY_CODE></COUNTRY_CODE>
				<CONTACT>
					<QUALIFIER></QUALIFIER>
					<NUMBER>1111111</NUMBER>
				</CONTACT>			
			</ADD>			
			<ADD>
				<QUALIFIER>ST</QUALIFIER>
				<IDENTIFIER></IDENTIFIER>
				<AGENCY_CODE></AGENCY_CODE>
				<PARTY_NAME_1></PARTY_NAME_1>
				<STREET_1></STREET_1>
				<CITY></CITY>
				<POSTAL_CODE></POSTAL_CODE>
				<CONTACT>
					<QUALIFIER></QUALIFIER>
					<NUMBER>2222222</NUMBER>
				</CONTACT>	
			</ADD>
    </GRP>
</SEEDELFOR>

我如何更正我的xslt?

希望你能帮助我。

最好的问候 朱利安

2 个答案:

答案 0 :(得分:1)

您可以通过以下方式重写模板 GRP

<xsl:template match="GRP">
    <xsl:copy>
        <!--copy the data from ADD - ST to the GRP so it can be used in the mapping 
            to set the delivery address from end customer -->
        <xsl:variable name="contact_ST">
            <xsl:for-each select="./ADD">
                <xsl:if test="./QUALIFIER='ST'">
                    <CONTACT_NUMBER>
                        <xsl:value-of select="CONTACT/NUMBER" />
                    </CONTACT_NUMBER>
                </xsl:if>
            </xsl:for-each>
        </xsl:variable>
        <xsl:variable name="contact_CN">
            <xsl:for-each select="./ADD">
                <xsl:if test="./QUALIFIER='CN'">
                    <CONTACT_NUMBER>
                        <xsl:value-of select="CONTACT/NUMBER" />
                    </CONTACT_NUMBER>
                </xsl:if>
            </xsl:for-each>
        </xsl:variable>
        <xsl:for-each select="./ADD">
            <xsl:if test="./QUALIFIER='ST'">
                <xsl:copy-of select="PARTY_NAME_1" />
                <xsl:copy-of select="STREET_1" />
                <xsl:copy-of select="CITY" />
                <xsl:copy-of select="POSTAL_CODE" />
                <xsl:copy-of select="COUNTRY_CODE" />
            </xsl:if>
        </xsl:for-each>
        <xsl:choose>
            <xsl:when test="$contact_CN != ''">
                <xsl:copy-of select="$contact_CN" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy-of select="$contact_ST" />
            </xsl:otherwise>
        </xsl:choose>

        <!--copy all other nodes -->
        <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
</xsl:template>

答案 1 :(得分:1)

请考虑以下简化示例:

<xsl:template match="GRP">
    <xsl:copy>
        <!-- other code, if necessary-->
        <xsl:variable name="cn" select="ADD[QUALIFIER='CN']" />
        <xsl:variable name="st" select="ADD[QUALIFIER='ST']" />
        <CONTACT_NUMBER>
            <xsl:choose>
                <xsl:when test="$cn">
                    <xsl:value-of select="$cn/CONTACT/NUMBER"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="$st/CONTACT/NUMBER"/>
                </xsl:otherwise>
            </xsl:choose>
        </CONTACT_NUMBER>
        <!-- more code, if necessary-->
    </xsl:copy>
</xsl:template>