分行符上的XSLT拆分地址

分行符上的XSLT拆分地址,xslt,xslt-1.0,Xslt,Xslt 1.0,我有一个XML,地址如下: <ADDRESS>SHIPPING ADDRESS 1 SHIPPING ADDRESS 2 SHIPPING ADDRESS 3</ADDRESS> 送货地址1 送货地址2 送货地址3 我需要将其转换为: <ADDRESS1>SHIPPING ADDRESS 1</ADDRESS1> <ADDRESS2>SHIPPING ADDRESS 2</ADDRESS2> 送货地址1 送货地址2

我有一个XML,地址如下:

<ADDRESS>SHIPPING ADDRESS 1
SHIPPING ADDRESS 2
SHIPPING ADDRESS 3</ADDRESS>
送货地址1
送货地址2
送货地址3
我需要将其转换为:

<ADDRESS1>SHIPPING ADDRESS 1</ADDRESS1>
<ADDRESS2>SHIPPING ADDRESS 2</ADDRESS2>
送货地址1
送货地址2
(忽略第三行)


注意:我使用的是XSLT 1.0,如果您只需要前两行,可以执行以下操作:

<xsl:template match="ADDRESS">
    <ADDRESS1>
        <xsl:value-of select="substring-before(., '&#10;')" />
    </ADDRESS1>
    <ADDRESS2>
        <xsl:value-of select="substring-before(substring-after(., '&#10;'), '&#10;')" />    
    </ADDRESS2>
</xsl:template>

这假设至少有三条线。否则它会变得更复杂。例如,您可以使用:

<xsl:template match="ADDRESS">
    <xsl:variable name="address" select="concat(., '&#10;&#10;')" />
    <ADDRESS1>
        <xsl:value-of select="substring-before($address, '&#10;')" />
    </ADDRESS1>
    <ADDRESS2>
        <xsl:value-of select="substring-before(substring-after($address, '&#10;'), '&#10;')" /> 
    </ADDRESS2>
</xsl:template>


无论源地址有多少行,都要创建两行地址。

如果只需要前两行,可以执行以下操作:

<xsl:template match="ADDRESS">
    <ADDRESS1>
        <xsl:value-of select="substring-before(., '&#10;')" />
    </ADDRESS1>
    <ADDRESS2>
        <xsl:value-of select="substring-before(substring-after(., '&#10;'), '&#10;')" />    
    </ADDRESS2>
</xsl:template>

这假设至少有三条线。否则它会变得更复杂。例如,您可以使用:

<xsl:template match="ADDRESS">
    <xsl:variable name="address" select="concat(., '&#10;&#10;')" />
    <ADDRESS1>
        <xsl:value-of select="substring-before($address, '&#10;')" />
    </ADDRESS1>
    <ADDRESS2>
        <xsl:value-of select="substring-before(substring-after($address, '&#10;'), '&#10;')" /> 
    </ADDRESS2>
</xsl:template>


无论源地址有多少行,都要创建两个地址行。

以下是另一个适用于任意行数的答案:

  <xsl:template match="ADDRESS">
    <xsl:call-template name="splitAddress">
      <xsl:with-param name="string" select="."/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="splitAddress">
    <xsl:param name="string"/>
    <xsl:param name="AddrNo" select="1"/>
    <xsl:choose>


  <xsl:when test="$AddrNo = 2">
    <xsl:element name="ADDRESS{$AddrNo}">
      <xsl:value-of select="substring-before($string, '&#10;')"/>
    </xsl:element>
  </xsl:when>


      <xsl:when test="contains($string, '&#10;')">
        <xsl:element name="ADDRESS{$AddrNo}">
          <xsl:value-of select="substring-before($string, '&#10;')"/>
        </xsl:element>
        <xsl:call-template name="splitAddress">
          <xsl:with-param name="string" select="substring-after($string, '&#10;')"/>
          <xsl:with-param name="AddrNo" select="$AddrNo + 1"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:element name="ADDRESS{$AddrNo}">
          <xsl:value-of select="$string"/>
        </xsl:element>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

--编辑--
我错过了在第二行地址后停车的要求。我在上面插入了
xsl:when
以根据需要结束处理:这里的条件可以根据需要进行编辑。

下面是另一个适用于任意行数的答案:

  <xsl:template match="ADDRESS">
    <xsl:call-template name="splitAddress">
      <xsl:with-param name="string" select="."/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="splitAddress">
    <xsl:param name="string"/>
    <xsl:param name="AddrNo" select="1"/>
    <xsl:choose>


  <xsl:when test="$AddrNo = 2">
    <xsl:element name="ADDRESS{$AddrNo}">
      <xsl:value-of select="substring-before($string, '&#10;')"/>
    </xsl:element>
  </xsl:when>


      <xsl:when test="contains($string, '&#10;')">
        <xsl:element name="ADDRESS{$AddrNo}">
          <xsl:value-of select="substring-before($string, '&#10;')"/>
        </xsl:element>
        <xsl:call-template name="splitAddress">
          <xsl:with-param name="string" select="substring-after($string, '&#10;')"/>
          <xsl:with-param name="AddrNo" select="$AddrNo + 1"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:element name="ADDRESS{$AddrNo}">
          <xsl:value-of select="$string"/>
        </xsl:element>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

--编辑--
我错过了在第二行地址后停车的要求。我在上面插入了
xsl:when
以根据需要结束处理:这里的条件可以根据需要进行编辑。

您使用的是哪个XSLT 1.0处理器?@michael.hor257k我是XSLT新手,不确定答案。一个C#应用程序正在调用它。您使用的是哪种XSLT1.0处理器?@michael.hor257k我对XSLT不熟悉,不确定答案。它正在被一个C#应用程序调用。这并没有忽略OP要求的第三行。完成:为错过这一行表示歉意。我认为最好使用xsl:when设置一个可编辑的停止条件(为了可读性,我将其分隔到了自己的行中),以防以后需要更改该要求。这不会忽略OP要求的第三行。完成:对于错过该行,我深表歉意。我认为最好使用xsl:when设置一个可编辑的停止条件(为了可读性,我将其分隔到自己的行中),以防以后需要更改需求。